0

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

托比

4

1 回答 1

1

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

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

于 2011-08-04T18:29:03.443 回答