gpt4 book ai didi

linux - 判断socket上是否还有Data残留并丢弃

转载 作者:太空宇宙 更新时间:2023-11-04 11:37:11 26 4
gpt4 key购买 nike

我正在 Linux 下编写一个从 TCP 套接字获取数据的接口(interface)。用户提供一个缓冲区,其中存储接收到的数据。如果提供的缓冲区太小,我只想返回一个错误。第一个问题是确定缓冲区是否太小。 recv() 函数只返回实际写入缓冲区的字节数。如果我使用 recv() 联机帮助页上声明的 MSG_TRUNcflags,它仍然会返回相同的结果。第二个问题是丢弃仍在套接字中排队的数据。因此,如果我确定我提供的缓冲区太小,我只想删除套接字上留下的所有内容。除了关闭并再次打开套接字或只接收直到什么都不剩下,还有其他方法吗?最好的问候

托比

最佳答案

如手册页中所述,MSG_TRUNC 仅对数据包套接字(例如 UDP)有效,因此对于基于流的 TCP 套接字,这将无法正常工作。在 stackoverflow 和其他地方有数百篇文章讨论在 TCP 上保留应用程序消息边界(提示:你需要自己做这个,TCP 是一个字节流接口(interface)但不是)所以我不会在这里详细介绍,我只想说,您需要一种机制来了解 recv() 端的应用程序“消息”或“数据包”有多大,以使您能够通过 TCP 执行您想要的操作(或者您需要切换到 UDP) .

对于 TCP,如果您需要“耗尽”套接字,读取直到没有数据剩余是可行的,但是,同样,您需要考虑如上所述的消息边界,这样您就不会读取一个“消息”并开始进入下一个(同样,要记住的最重要的一点是 TCP 提供字节流接口(interface),不一定会保留您对应用程序级数据包或消息的概念)。

关于linux - 判断socket上是否还有Data残留并丢弃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6943512/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com