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

Network programming Linux recv返回Wireshark捕获中未看到的数据,network-programming,wireshark,Network Programming,Wireshark,我通过TCP套接字接收数据,尽管此代码已经运行多年,但我在尝试将新设备(用作服务器)集成到我的系统中时遇到了一个非常奇怪的行为: 在接收HTTP正文响应之前,recv()内核函数会给我一些奇怪的字符,比如“283”或“7b” 实际上,我正在使用gdb进行调试,我可以看到变量在recv()被调用之后就保存了这些值(因此这不仅仅是printf向我展示的内容) 我总是使用recv()函数逐个读取字节(一次读取一个字节),返回值总是正值 接收到的HTTP正文的第一行在Wireshark(!)中看不到,

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

在接收HTTP正文响应之前,recv()内核函数会给我一些奇怪的字符,比如“283”或“7b”

  • 实际上,我正在使用gdb进行调试,我可以看到变量在recv()被调用之后就保存了这些值(因此这不仅仅是printf向我展示的内容)
  • 我总是使用recv()函数逐个读取字节(一次读取一个字节),返回值总是正值
  • 接收到的HTTP正文的第一行在Wireshark(!)中看不到,也不希望出现在那里。在Wireshark,我看到了我期望得到的东西
  • 我更改了发送数据的设备,但仍然收到完全相同的值
  • 我执行了一个干净的调试构建,还尝试了我的程序的发布版本,但仍然得到了完全相同的值,所以我假设这些值不是内存中的随机值
  • 我正在运行Linux内核3.2.58,没有升级/更新选项

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

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


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

没有它很难调试代码。我认为您指的是一个字节接一个字节。不是一位接一位。是的,我指的是字节;)