我写了一个简单的服务器和客户端应用程序,我可以在其中切换 TCP、DCCP 和 UDP 协议(protocol)。目标是将一个文件从一个传输到另一个并测量每个协议(protocol)的流量,这样我就可以针对不同的网络设置比较它们(我大致知道结果应该是什么,但我需要确切的数字/图表)。无论如何,在不同的计算机上启动两个应用程序并启动 tcpdump 后,我只在 tcpdump-log 中从我的 4GB 文件中获取前几 MB(~50MB)。这些应用程序是用标准的 C/C++ 代码编写的,可以在网络上的任何地方找到。 可能是什么问题或者我在这里做错了什么?
-- 编辑
我使用的命令行是:
tcpdump -s 1500 -w mylog
tcpdump 仅在前 ~55 秒 捕获数据包。那是客户端需要将文件发送到套接字的时间。之后它停止,即使服务器继续接收文件并将其写入硬盘驱动器。
-- 编辑2
源代码:
client.cpp
server.cpp
common.hpp
common.cpp
-- 最终编辑
正如你们中的许多人所指出的(正如我所怀疑的),源代码中存在一些误解/错误。在我清理它(或几乎重写它)之后,它可以根据需要与 tcpdump 一起工作。我将接受来自@Laurent Parenteau 的回答,但仅针对第 5 点,因为它与问题唯一相关。如果有人对正确的代码感兴趣,这里是:
已编辑源代码
最佳答案
代码中有很多错误。
- 文件大小/传输大小被硬编码为 4294967295 字节。因此,如果提供的文件不是那么多字节,您就会遇到问题。
- 在发件人中,您不会检查文件读取是否成功。因此,如果文件小于 4294967295 字节,您将不知道并通过网络发送垃圾数据(或根本不发送任何数据)。
- 当您使用 UDP 和 DDCP 时,无法保证数据包的顺序,因此接收到的数据可能是乱序的(即垃圾)。
- 当您使用 UDP 时,不会重新传输丢失的数据包,因此可能永远不会收到某些数据。
- 在接收器中,您不会检查收到了多少字节,您总是将 MAX_LINE 字节写入文件。因此,即使您收到 0 个字节,您仍然会写入文件,这是错误的。
- 当您使用 UDP 时,由于您在大腿循环中发送,即使 write() 调用返回与您请求的发送字节数相同的字节数,网络堆栈也可能会丢弃大量数据或网络接口(interface),因为没有适当的拥塞控制。因此,您需要自己实现一些拥塞控制。
这只是快速扫描代码,可能还有更多问题......
我的建议是: 尝试使用 TCP 进行传输,对您读取/发送的文件进行 md5sum,对您接收/保存的文件进行 md5sum,然后比较 2 个 md5sum。一旦这个案例开始工作,您就可以开始使用 UDP 和 DCCP 进行测试(仍然使用 md5sum 比较)...
对于 tcpdump 命令,您应该将 -s 1500
更改为 -s 0
,这意味着 unlimited
。使用该 tcpdump 命令,您可以相信它没有发送/接收到它看不到的数据。另一件好事是比较发送方和接收方的 tcpdump 输出。这样您就可以知道两个网络堆栈之间是否发生了一些数据包丢失。
关于c++ - 使用 tcpdump 捕获服务器-客户端通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3342202/