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

时间:2015-06-15 15:47:29

标签: c++ sockets networking udp iperf

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

基本上,我在机器A上以iperf生成UDP流量,目的地是机器C.但是,我首先通过机器B **路由此流量,然后通过原始套接字将其发送到机器C到端口使用iperf的5001(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上收到标题时打印出标题,我看不到任何奇怪的内容。

1 个答案:

答案 0 :(得分:1)

有趣。通过将机器A上的TUN设备分配给eth0的IP地址,解决了问题。以前,我将TUN设备分配给它自己的IP地址(我确实试图从TUN设备中删除一个IP地址,但它默认为eth1。这也没有用。 )。

我猜是因为这种情况发生了一些修改,或者某些隧道/连接没有由iperf建立,因为数据包没有被eth0发送出去之前。

如果有人对如何/为何如此有效进一步了解,我会非常感兴趣。