2013-03-14 19 views
0

我打開了UDP套接字來偵聽傳入數據包。我可以在wireshark日誌中看到到達NIC的數據包。但是,通過Socket讀取時不可用。 'netsatat'命令顯示監聽任何傳入UDP消息的端口號。套接字閱讀器繼續等待。我在Linux(ubuntu)環境中使用Java和C進行了檢查。我可以看到接收到的IPV4數據包的標識值是0.該值是否可以爲套接字讀取數據發揮任何作用? 讀取插槽我的C代碼NIC中收到的數據包沒有通過套接字讀取

int sock, n, nr; 
socklen_t fromlen; 
struct sockaddr_in server; 
struct sockaddr_in from; 
sock = socket(AF_INET, SOCK_DGRAM, 0); 
if (sock < 0) 
printf("Can not create socket in server\n"); 
memset(&server, 0, sizeof(struct sockaddr_in)); 
server.sin_family = AF_INET; 
server.sin_port = htons(5555); 
server.sin_addr.s_addr = INADDR_ANY; 
if(bind(sock, (struct sockaddr *)&server, sizeof(server)) < 0) 
fromlen = sizeof(struct sockaddr_in); 
while(1) {  
    printf("Waiting to receive\n"); 
    n = recvfrom(sock, &nr, sizeof(nr), 0, (struct sockaddr *) &from, &fromlen); 
    printf("I have received"); 
} 

請找到Wireshark的跟蹤http://imgur.com/Au9BeS1

+1

沒有看到你所做的事情就無法說出任何話。請製作[SSCCE](http://sscce.org/)給我們看。 – 2013-03-14 08:53:08

+0

@JoachimPileborg添加了代碼和鏈接以跟蹤。請讓我知道,如果你需要更多的細節 – 2013-03-15 03:50:56

回答

1

這是一個問題:

if(bind(sock, (struct sockaddr *)&server, sizeof(server)) < 0) 
fromlen = sizeof(struct sockaddr_in); 

這將只設置fromlenbind電話失敗。由於fromlen未正確初始化,因此它將包含一個看似無效的值,該值不適用於recvfrom

+0

綁定似乎工作正常。我能夠接收帶有Flag,Do not Fragment設置爲0的IP數據包,但對於Don'Fragment = 1,數據包到達以太網但未到達應用程序。有沒有什麼好的方法來調試呢? IP中的數據包長度爲820,我的eth0的MTU大小爲1500 – 2013-03-20 04:27:05

+0

@vasanthmahadevan是的,'bind'調用可以工作,但是'fromLen'不會被設置。由於縮進,或者說縮進,可能很難看到。另外,如果'bind'失敗(以及'socket'調用),那麼你不應該繼續發生任何事情。 – 2013-03-20 06:32:47

相關問題