我有一个程序需要在通过机器路由后测量总损耗。
iperf
本质上,我在机器 A 上生成发往机器 C 的UDP 流量。但是,我首先通过机器 B** 路由此流量,然后通过原始套接字将其发送到机器 C 到端口 5001(iperf
侦听的默认端口) ) 与sendto()
. 运行 atcpdump
显示机器 C 上正在接收数据包时,iperf
服务器看不到这些连接或数据包。
我已经在iperf
源代码中搜索了一下以了解它是如何工作的,并且我看到该函数接受了数据包
rc = recvfrom( mSettings->mSock, mBuf, mSettings->mBufLen, 0,
(struct sockaddr*) &server->peer, &server->size_peer );.
基本上,因为它只是 a recvfrom
,如果我非常确定我不会随时修改数据包,并且使用函数sendto(s, buf, len, 0, (struct sockaddr*) &si_other, slen)
和 a发送它们,我不明白为什么会有问题socket(AF_INET, SOCK_RAW, IPPROTO_UDP)
。
有人有想法么?为什么没有iperf
注意到这种联系?
**我实际上将数据包路由到机器 A 上的 TUN 设备,然后从 A 上的用户空间程序中读取它们,使用 UDP 套接字将它们发送到 B,在 B 上的用户空间程序上读取它们,然后通过原始套接字发送它们带IP_HDRINCL
残疾人。我在机器 A 和 B 上收到标题时打印出标题,我没有看到任何奇怪的东西。