我写了一个简单的服务器和客户端应用程序,我可以在其中切换TCP,DCCP和UDP协议。目标是将文件从一个文件传输到另一个文件并测量每个协议的流量,因此我可以将它们与不同的网络设置进行比较(我大致知道结果应该是什么,但我需要精确的数字/图表)。无论如何在不同的计算机上启动这两个应用程序并启动tcpdump之后,我只能从tcpdump-log获取我的4GB文件中的前几个MB(~50MB)。这些应用程序是用标准的C / C ++代码编写的,可以在网络上的任何地方找到。 可能是什么问题或者我在这里做错了什么?
- 编辑
我使用的命令行是:
tcpdump -s 1500 -w mylog
tcpdump 然后捕获数据包仅第一个~55秒。这是客户端将文件发送到套接字所需的时间。之后它会停止,即使服务器继续接收文件并将文件写入硬盘驱动器。
- Edit2
源代码:
client.cpp
server.cpp
common.hpp
common.cpp
- 编辑最终
正如你们许多人指出的那样(而且我怀疑)源代码中存在一些误解/错误。在我清理它(或几乎重写了它)后,它可以根据需要使用tcpdump。我会接受来自@Laurent Parenteau 的答案,但仅限于第5点。,因为这是问题的唯一相关内容。如果有人对正确的代码感兴趣,那么它就是:
已编辑的源代码
答案 0 :(得分:7)
代码中存在许多错误。
这只是对代码的快速扫描,可能存在更多问题......
我的建议是: 尝试使用TCP传输,执行读取/发送文件的md5sum,以及接收/保存文件的md5sum,并比较2 md5sum。一旦你的这个案例工作,你可以转向测试(仍然使用md5sum比较)与UDP和DCCP ......
对于tcpdump命令,您应该更改-s 1500
的{{1}},这意味着-s 0
。使用该tcpdump命令,您可以信任它未发送/接收的数据。另一个好处是比较发送方的tcpdump输出和接收方。通过这种方式,您可以知道两个网络堆栈之间是否丢失了一些数据包。
答案 1 :(得分:3)
你有x术语访问权限吗?切换到Wireshark并尝试使用它 - 它的免费,开源,并且今天可能比tcpdump更广泛使用。 (它以前被称为Ethereal。)
另外,请尝试以下tcpdump选项:
这两个千兆以太网卡都在两端吗?
答案 2 :(得分:2)
tcpdump
被全世界数以万计(至少)的程序员和计算机安全专业人员用作诊断和取证工具。当像这样的工具似乎错误地处理一个非常常见的任务时,首先要怀疑的是你编写的代码,而不是工具。
在这种特殊情况下,您的代码会出现各种重大错误。特别是,使用TCP,无论客户端是否发送任何数据,您的服务器都将继续将数据写入文件。
此代码具有竞争条件,在某些情况下会导致非确定性行为,不正确地将'\0'
视为网络数据中的特殊值,忽略错误条件,并忽略文件结束条件。这只是一个简短的阅读。
在这种情况下,我几乎可以确定tcpdump
运行正常,并告诉您应用程序没有按照您的想法执行。
答案 3 :(得分:2)
“这是客户需要的时间 将文件发送到套接字。 之后它会停止,即使是 服务器继续接收和写入 该文件到硬盘。“
这听起来很奇怪。套接字缓冲区太小,不允许发生这种情况。我真的认为您的服务器代码似乎只接收数据,而发件人实际上已经停止发送数据。
答案 4 :(得分:0)
我知道这可能听起来很傻,但你确定这不是文件的flush()问题吗?即数据仍在内存中,尚未写入磁盘(因为它们的数量不足)。
尝试sync
或稍等一下,直到您确定已传输了足够的数据。