2013-10-02 35 views
0

我設置了兩個tun設備。被寫入到每個tun設備的數據是使用一個簡單的循環轉發通過UDP套接字到另一tun設備:tun設備:消息未被服務器進程接收

// the tuntap device is created using these flags 
ifr.ifr_flags = IFF_TUN | IFF_NO_PI; 
[...] 

fd_set fd_list; 


FD_ZERO(&fd_list); 
FD_SET(fd1, &fd_list); // fd1 is the tun device 
FD_SET(fd2, &fd_list); // fd2 is the udp socket 

int fds[] = {fd1, fd2}; 
while(select(max(fd1, fd2)+1, &fd_list, NULL, NULL, NULL) > -1) { 
    for(i = 0; i < 2; ++i) 
     if(FD_ISSET(fds[i], &fd_list)) { 
      nread = read(fds[i], buf, sizeof(buf)); 
      assert(nread > 0); 

      ret = write(fds[(i+1)%2], buf, nread); 
      if(ret == -1) 
       perror("write():"); 
     } 
} 

使用

ifconfig tun0 10.0.0.1 
ifconfig tun1 10.0.0.2 

建立接口後我從發送ping一個設備到另一個

ping -I tun1 10.0.0.1 

我可以看到UDP數據包由tun0的UDP套接字接收,並且此數據包正確寫入到tun0。使用wireshark觀看tun0上的流量也表明數據包由tun0接收。但是,不會創建ping響應數據包。

我認爲這可能是ICMP數據包的特殊情況,但是當我使用

socat -d -d -d - TCP-LISTEN:2000,so-bindtodevice=tun0 & 
sleep 1 
echo 2 | socat -d -d -d - TCP:10.0.0.1:2000,so-bindtodevice=tun1 

又未建立連接。連接過程(第二個socat的呼叫)只會繼續觸發TCP-SYN數據包並最終超時。再次,使用wireshark觀察tun0上的流量,表明TCP-SYN數據包已交付給tun0設備。

爲什麼這個數據包沒有被喚醒到socat TCP-LISTEN進程,所以它可以建立連接?

回答

相關問題