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



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

本质上,我在机器 A 上生成带有 iperf 的 UDP 流量,该流量发往机器 C。但是,我首先通过机器 B** 路由此流量,然后通过原始套接字将其发送到机器 C 到端口 5001(iperf侦听的默认端口),并带有 sendto() 。当运行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 上收到时打印出标题,我没有看到任何奇怪的东西。

有趣。事实证明,通过将机器A上的TUN设备分配给eth0的IP地址,该问题已得到解决。之前,我将 TUN 设备分配给它自己的 IP 地址(我确实尝试从 TUN 设备中删除 IP 地址,但后来它默认为 eth1 .那也没用。

我想由于这个原因发生了一些修改,或者iperf没有建立某种隧道/连接,因为数据包之前没有从eth0发送出去。

如果有人对如何/为什么工作有任何进一步的见解,我会非常感兴趣。

相关内容

  • 没有找到相关文章

最新更新