【问题标题】:Determine if there is Data left on the socket and discard it判断socket上是否还有Data并丢弃
【发布时间】:2011-08-07 02:48:06
【问题描述】:

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

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

【问题讨论】:

  • 免责声明/解释位是不必要的。只要问你的问题。
  • 拜托,你能提供原帖的链接吗?

标签: linux sockets buffer recv


【解决方案1】:

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

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

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

  • 读取 N 个字节,并且
  • 读取直到读取分隔符

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

【讨论】:

    【解决方案2】:

    你的设计有缺陷。

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

    【讨论】:

      猜你喜欢
      • 2021-11-30
      • 2021-10-20
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 2011-12-14
      • 1970-01-01
      相关资源
      最近更新 更多