一尘不染

确定套接字上是否还有数据并丢弃

linux

我正在Linux下编写一个从TCP套接字获取数据的接口。用户提供一个缓冲区,在其中存储接收到的数据。如果提供的缓冲区太小,我只想返回一个错误。第一个问题是确定缓冲区是否过小。recv()函数仅向我返回实际写入缓冲区的字节数。如果我使用recv()联机帮助页上所述的MSG_TRUNC标志,它仍然返回相同的内容。第二个问题是丢弃仍在套接字中排队的数据。因此,如果我确定提供的Buffer很小,我只想擦除套接字上剩余的所有内容。除了重新关闭并打开套接字,或者只是接收直到什么都没剩下,还有其他方法吗?最好的问候<

一个建议是只是recv直到什么都没剩下(我返回0)-但是这样做最终不必等待预设的超时(在这种情况下是5秒?),因为每次我调用recv时,它都会等待数据或超时?


阅读 196

收藏
2020-06-02

共1个答案

一尘不染

在TCP级别上,不知道什么构成应用协议消息。但是,有两种最常见的方法来分隔TCP流中的消息:

  • 给消息加上大小并读取那么多字节,或者
  • 读取直到找到一定的字节序列为止。

因此,一个通用的TCP读取器应该提供两个通用的读取功能:

  • 读取N个字节,并且
  • 读取直到读取了定界符

类似于Tornado
IOStream
读取功能的设计也可以。

2020-06-02