C++ 捕获与tcpdump的服务器客户端通信
我编写了一个简单的服务器和客户端应用程序,可以在TCP、DCCP和UDP协议之间切换。目标是将一个文件从一个传输到另一个,并测量每个协议的流量,这样我就可以比较不同网络设置的流量(我大致知道结果应该是什么,但我需要精确的数字/图形)。无论如何,在不同的计算机上启动两个应用程序并启动tcpdump之后,我只在tcpdump日志中获得4GB文件中的前几MB(~50MB)。这些应用程序是用标准的C/C++代码编写的,可以在web上的任何地方找到。 这里可能有什么问题,或者我做错了什么 --编辑 我使用的命令行是:C++ 捕获与tcpdump的服务器客户端通信,c++,client-server,communication,packet-capture,tcpdump,C++,Client Server,Communication,Packet Capture,Tcpdump,我编写了一个简单的服务器和客户端应用程序,可以在TCP、DCCP和UDP协议之间切换。目标是将一个文件从一个传输到另一个,并测量每个协议的流量,这样我就可以比较不同网络设置的流量(我大致知道结果应该是什么,但我需要精确的数字/图形)。无论如何,在不同的计算机上启动两个应用程序并启动tcpdump之后,我只在tcpdump日志中获得4GB文件中的前几MB(~50MB)。这些应用程序是用标准的C/C++代码编写的,可以在web上的任何地方找到。 这里可能有什么问题,或者我做错了什么 --编辑 我使用
tcpdump -s 1500 -w mylog
tcpdump仅在前55秒捕获数据包。这是客户端需要将文件发送到套接字的时间。之后它停止,即使服务器继续接收文件并将其写入硬盘
--编辑2
源代码:
--编辑定稿 正如你们中的许多人所指出的(正如我所怀疑的),源代码中存在一些误解/错误。在我清理(或几乎重写)之后,它可以根据需要与tcpdump一起工作。我将接受@Laurent Parenteau的答案,但仅限于第5点。因为这是唯一与问题相关的答案。如果有人对正确的代码感兴趣,请参见: 源代码编辑
代码中有很多地方出错
对于tcpdump命令,您应该将
-s 1500
更改为-s 0
,这意味着无限
。使用tcpdump命令,您可以相信它没有看到的数据没有被发送/接收。另一个好方法是比较发送方和接收方的tcpdump输出。这样,您就可以知道两个网络堆栈之间是否发生了数据包丢失。您有x术语访问权限吗?改用tcpdump并尝试使用它——它是免费的、开源的,并且可能比现在的tcpdump使用得更广泛。(它以前被称为以太。)
另外,请尝试以下tcpdump选项:
- -xx也打印数据包的链接头和数据(是否-w写入数据?)
- -C显式指定最大文件大小李>
- -U将数据包逐个写入文件,而不是刷新缓冲区李>
- -p不要将nic置于混乱模式
- -O不要使用数据包匹配优化器,因为您的是一个新的应用程序级协议
- 您是否在tcpdump中使用详细输出?这可以使缓冲区快速填满,以便在运行stdout/err时将其重定向到文件
这些千兆以太网卡在两端吗?我知道这听起来很傻,但你确定这不是文件的flush()问题吗?也就是说,数据仍在内存中,尚未写入磁盘(因为数据量不足)
尝试
sync
或稍等片刻,直到您确定传输了足够的数据。tcpdump
被全球成千上万(至少)程序员和计算机安全专业人士用作诊断和取证工具。当像这样的工具似乎在错误处理一个非常常见的任务时,首先要怀疑的是您编写的代码,而不是工具
在这种特殊情况下,您的代码有各种各样的重大错误。特别是,使用TCP,无论客户端是否发送数据,服务器都将继续向文件写入数据
此代码具有在某些情况下会导致不确定行为的竞争条件,不正确地将'\0'
视为网络数据中的特殊值,忽略错误条件,并忽略文件结束条件。这只是一个简短的阅读
在这种情况下,我几乎可以肯定,tcpdump
运行正常,并告诉您您的应用程序没有按照您认为的那样运行
“这是客户需要的时间
将文件发送到套接字。
之后它停止了,即使
服务器继续接收和写入数据
将文件复制到硬盘驱动器。“
这听起来很奇怪。套接字缓冲区太小,不允许发生这种情况。我真的认为您的服务器代码似乎只接收数据,而发送方实际上已经停止发送数据。默认情况下,只发送tcpdump