Linux recv返回Wireshark捕获中未看到的数据

时间:2018-08-13 09:29:50

标签: network-programming wireshark

我正在通过TCP套接字接收数据,尽管此代码已经使用了很多年,但是我遇到了一个非常奇怪的行为,试图将新设备(充当服务器)集成到我的系统中:

在接收到HTTP Body响应之前,recv()内核函数会给我一些奇怪的字符,例如'283'或'7b'。

  • 我实际上正在用gdb进行调试,我可以看到变量在调用recv()之后立即拥有这些值(因此,这不仅是printf向我显示的内容)
  • 我总是使用recv()函数逐字节读取字节(一次读取),并且返回值始终为正。
  • 在Wireshark(!)中看不到收到的HTTP正文的第一行,也不希望出现在该行中。在Wireshark中,我可以看到预期的结果。
  • 我更改了向我发送数据的设备,但我仍然收到完全相同的值
  • 我执行了一个干净的调试版本,并尝试了我的programm的发行版,但仍然获得了完全相同的值,因此我认为这些值不是随机出现在内存中的值。
  • 我正在运行Linux内核3.2.58,无法选择升级/更新。

我不确定我应该提供什么其他信息,我也不知道还有什么尝试。

1 个答案:

答案 0 :(得分:0)

找到了。问题是我没有考虑Transfer-Encoding,这是分块。我很幸运,因为Wireshark的较旧版本还在有效负载中显示了这些字节,因此其他人也在Wireshark论坛中发布了类似的问题。

这些“奇怪的”字节显示您应该接收的有效载荷长度。读取完该字节数后,您将再次收到一个数字,该数字告诉您是否应继续读取(以及再次接收多少个字节)。据我了解,当您拥有动态变化的数据并且您可能希望不断获取其当前值时,这很有用。