2015-06-15 91 views
1

我有一個程序,需要通過機器路由後測量總損失。通過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上收到標題時會打印出標題,而且我沒有看到任何奇怪的東西。

回答

1

有趣。原來問題是通過將機器A上的TUN設備分配到eth0的IP地址來解決的。之前,我將TUN設備分配給它自己的IP地址(我嘗試從TUN設備中刪除IP地址,但默認爲eth1,但這也不起作用)。

我猜想一些修改是由於這個原因發生的,或者某種隧道/連接沒有通過iperf建立,因爲數據包之前沒有被髮送出eth0

如果任何人有任何進一步的見解,爲什麼這個工程,我會很感興趣。