使用tcpdump捕获服务器 - 客户端通信

ste*_*ita 2 c++ client-server communication packet-capture tcpdump

我写了一个简单的服务器和客户端应用程序,我可以在TCP,DCCP和UDP协议之间切换.目标是将文件从一个文件传输到另一个文件并测量每个协议的流量,因此我可以将它们与不同的网络设置进行比较(我大致知道结果应该是什么,但我需要精确的数字/图表).无论如何在不同的计算机上启动这两个应用程序并启动tcpdump后,我只能从tcpdump-log获取我的4GB文件中的前几个MB(~50MB).这些应用程序是用标准的C/C++代码编写的,可以在网络上的任何地方找到.可能是什么问题或者我在这里做错了什么?

- 编辑

我使用的命令行是:

tcpdump -s 1500 -w mylog
Run Code Online (Sandbox Code Playgroud)

tcpdump 仅在第一个~55秒内捕获数据包.这是客户端将文件发送到套接字所需的时间.之后它会停止,即使服务器继续接收文件并将文件写入硬盘驱动器.

- Edit2

源代码:

client.cpp
server.cpp
common.hpp
common.cpp

- 编辑最终

正如你们许多人指出的那样(而且我怀疑)源代码中存在一些误解/错误.在我清理它(或几乎重写了它)后,它可以根据需要使用tcpdump.我会接受@Laurent Parenteau回答,但仅限于第5点.因为这是问题的唯一相关因素.如果有人对正确的代码感兴趣,那么它是:

源代码已编辑

client.cpp
server.cpp
common.hpp
common.cpp

Lau*_*eau 7

代码中有很多错误.

  1. 文件大小/传输大小硬编码为4294967295字节.因此,如果提供的文件不是那么多字节,那么你就会遇到问题.
  2. 在发件人中,您不会检查文件读取是否成功.因此,如果文件小于4294967295字节,您将不会知道它并通过网络发送垃圾数​​据(或根本不发送任何内容).
  3. 当您使用UDP和DDCP时,数据包顺序不保证,因此接收的数据可能无序(即垃圾).
  4. 使用UDP时,不会重传丢失的数据包,因此可能永远不会收到某些数据.
  5. 在接收器中,您不检查收到的字节数,总是将MAX_LINE字节写入文件.所以,即使你收到0个字节,你仍然会写入文件,这是错误的.
  6. 当你使用UDP时,由于你是在大腿循环中发送的,即使write()调用返回与你请求的相同数量的字节,大量数据也可能被网络堆栈或网络接口丢弃,因为没有拥堵控制.因此,您需要自己设置一些拥塞控制.

这只是对代码的快速扫描,可能存在更多问题......

我的建议是:尝试使用TCP传输,执行读取/发送的文件的md5sum,以及接收/保存的文件的md5sum,并比较2 md5sum.一旦你的这个案例工作,你可以转向测试(仍然使用md5sum比较)与UDP和DCCP ...

对于tcpdump命令,您应该更改-s 1500-s 0,这意味着unlimited.使用该tcpdump命令,您可以信任它未发送/接收的数据.另一个好处是比较发送方的tcpdump输出和接收方.这样您就可以知道两个网络堆栈之间是否丢失了一些数据包.