通过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
。
如果任何人有任何进一步的见解,为什么这个工程,我会很感兴趣。