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

标签 c++ client-server communication packet-capture tcpdump

我写了一个简单的服务器和客户端应用程序,我可以在其中切换 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 点,因为它与问题唯一相关。如果有人对正确的代码感兴趣,这里是:

已编辑源代码

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

最佳答案

代码中有很多错误。

  1. 文件大小/传输大小被硬编码为 4294967295 字节。因此,如果提供的文件不是那么多字节,您就会遇到问题。
  2. 在发件人中,您不会检查文件读取是否成功。因此,如果文件小于 4294967295 字节,您将不知道并通过网络发送垃圾数​​据(或根本不发送任何数据)。
  3. 当您使用 UDP 和 DDCP 时,无法保证数据包的顺序,因此接收到的数据可能是乱序的(即垃圾)。
  4. 当您使用 UDP 时,不会重新传输丢失的数据包,因此可能永远不会收到某些数据。
  5. 在接收器中,您不会检查收到了多少字节,您总是将 MAX_LINE 字节写入文件。因此,即使您收到 0 个字节,您仍然会写入文件,这是错误的。
  6. 当您使用 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/

相关文章:

c++ - 限制多个模板参数友元函数可访问的类实例的范围

mvvm - 6 个 ViewModel 和一个 Messenger 之间的通信 == AntiPattern?

sockets - 设计模式: Client - Server

c++ - 使用 ShellExecute 的进程之间的 IPC

c++ - qsort() vs std::sort,比较函数哲学差异

mongodb - 从不同客户端收集数据的最佳做法是什么?

android - 设备之间的Android套接字

使用 RS-422 的 Java 串行通信

c++ - Qt:当 boundingRect() 中心不在 View 中时,自定义 QGraphicsItem 不显示

java - 使用集合按顺序存储待处理的对象