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

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

问题描述:

我有一个程序,需要通过机器路由后测量总损失。通过UDP套接字手动发送给iperf? (C++)

本质上,我在计算机C上发送的机器A上的iperf生成UDP通信。但是,我首先通过计算机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

如果任何人有任何进一步的见解,为什么这个工程,我会很感兴趣。