通过 UDP 套接字手动发送到 iperf? (C++)

Manually send to iperf via UDP socket? (C++)

我有一个程序需要测量通过机器布线后的总损耗。

本质上,我在机器 A 上使用 iperf 生成发往机器 C 的 UDP 流量。但是,我首先通过机器 B** 路由此流量,然后通过原始套接字将其发送到机器 C使用 sendto() 到端口 5001(iperf 监听的默认端口)。虽然 运行 a tcpdump 显示机器 C 正在接收数据包,但 iperf 服务器看不到这些连接或数据包。

我搜索了 iperf 源代码,看看它是如何工作的,我看到数据包被函数

接受
rc = recvfrom( mSettings->mSock, mBuf, mSettings->mBufLen, 0, 
                       (struct sockaddr*) &server->peer, &server->size_peer );. 

基本上,因为它只是一个 recvfrom,如果我非常确定我在任何时候都没有修改数据包并使用函数发送它们,我不明白为什么会有问题sendto(s, buf, len, 0, (struct sockaddr*) &si_other, slen) 和一个 socket(AF_INET, SOCK_RAW, IPPROTO_UDP)

有人有什么想法吗?为什么 iperf 没有注意到此连接?

**我实际上将数据包路由到机器 A 上的 TUN 设备,然后从 A 上的用户空间程序读取它们,使用 UDP 套接字将它们发送到 B,在 B 上的用户空间程序上读取它们,然后发送它们通过禁用 IP_HDRINCL 的原始套接字。当机器 A 和 B 收到时,我打印出 headers,但我没有看到任何奇怪的东西。

有意思。原来问题是通过将机器 A 上的 TUN 设备分配给 eth0 的 IP 地址来解决的。之前,我将 TUN 设备分配给它自己的 IP 地址(我确实尝试从 TUN 设备中删除 IP 地址,但后来它默认为 eth1。那也没有用。)。

我想一些修改是因为这个原因发生的,或者某种 tunneling/connection 不是由 iperf 建立的,因为数据包不是从 eth0 发出的之前。

如果有人对 how/why 这个作品有任何进一步的见解,我会非常感兴趣。