2011-08-04 25 views
1

我在Linux下编写一个接口,它从TCP套接字获取数据。用户提供一个缓冲区,其中存储接收的数据。如果提供的Buffer很小,我只想返回一个错误。首先问题是确定缓冲区是否很小。 recv()函数只是返回实际写入缓冲区的字节数。如果我使用recv()手册页中声明的MSG_TRUNC标志,它仍会返回相同的结果。第二个问题是丢弃仍然在套接字中排队的数据。所以,如果我确定我提供的Buffer很小,我只想擦除套接字上留下的所有内容。除了关闭并重新打开套接字或只是接收到没有剩下任何东西之外,是否还有其他方法可以这样做?最好的问候<确定是否有数据留在套接字上并丢弃它

一个建议是只是recv,直到没有剩余(我得到返回0) - 但不会因为每次我打电话给这个预设超时(在这种情况下,它是5秒? recv它等待数据还是超时?

+0

免责声明/解释位是不必要的。只是问你的问题。 – vezult

+0

请你能提供原帖的链接吗? – jweyrich

回答

4

在TCP级没有关于构成应用协议消息的知识。有,但是,最常见的两种方式TCP流划定消息:发现

  • 前缀邮件及其大小和读取的字节数,或者
  • 读,直到字节一定的顺序。

在该光中,通用TCP读者应该提供两个读取功能是普遍有用:

  • 读取N个字节,并
  • 读取直到分隔符已经被读取

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

1

您的设计存在缺陷。

如果客户端提供的缓冲区太小,您如何知道丢弃了多少数据?数据中是否有某些信息告诉您何时已达到要丢弃的消息末尾?如果是这种情况,那么您需要在代码中缓冲输入流,以便可以检测这些边界。如果您的代码将流视为未区分的字节,那么您的问题没有意义,因为您的代码原则上不知道何时停止丢弃数据。对于TCP流,除非有一个嵌入式协议来分隔“消息”,否则在连接关闭之前它是全有或全无的。

相关问题