1

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

一个建议是只接收直到什么都没有留下(我返回 0)——但结果不是必须等待预设的超时(在这种情况下是 5 秒?),因为每次我调用 recv 时它都会等待数据或超时?

4

2 回答 2

4

在 TCP 级别没有关于什么构成应用程序协议消息的知识。但是,有两种最常见的方式来分隔 TCP 流中的消息:

  • 为其大小添加前缀消息并读取那么多字节,或
  • 读取直到找到特定的字节序列。

鉴于此,通用 TCP 阅读器应提供两个普遍有用的阅读功能:

  • 读取 N 个字节,并且
  • 读到一个分隔符被读完

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

于 2011-08-04T17:45:27.877 回答
1

你的设计有缺陷。

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

于 2011-08-04T16:32:30.353 回答