2013-01-10 59 views
0

我正在做一堆子進程,每個孩子必須爲每個孩子製作一個不同IP的ARP包,發送包並從機器接收包含相應IP的包如果該機器是打開的。問題是我正確地發送包(我用wireshark檢查了這個),但我不知道爲什麼,我的所有子進程都收到相同的包。linux孩子recvfrom不工作,因爲它應該

例如我有192.167.0.1,88.4.3.2和100.20.3.20。只有第一個IP是好的。我有3個子進程,每個進程發送一個請求並等待響應8000000納秒。唯一的迴應是第一個IP的孩子(因爲是正確的),但我不知道爲什麼所有的孩子都會收到這個包。有什麼建議嗎? 這是一段代碼。我確信它正確地發送了包,因爲我用wireshark測試了它。

if (sendto(sock,&req,sizeof(req),0,(struct sockaddr*)&addr,sizeof(addr))==-1) { 
     printf("%s",strerror(errno)); 
    } 
    struct sockaddr_ll linkLayerAddr; 
    char buf[32]; 
    int sockaddr_len=sizeof(linkLayerAddr); 
    memset(&linkLayerAddr,0,sizeof(linkLayerAddr)); 
    fcntl(sock,F_SETFL,O_NONBLOCK); 
    nanosleep(&time1,NULL); 

    if(recvfrom(sock,buf,sizeof(buf),0,(struct sockaddr*)&linkLayerAddr,&sockaddr_len)==-1){ 

    info.status=0; 
    } 
    else{ 
    info.status=1; 

}

與我使用只是爲了檢查一些信息結構吳丹的事情。

+0

代碼在哪裏? – kmkaplan

+0

增加了一些code.Maybe它是因爲套接字? –

+0

原始套接字沒有連接,所以接收者獲取所有數據包,而不僅僅是與他們發送的數據包相關的數據包。 – Barmar

回答

1

ARP數據包不包含用於描述目標應用程序的端口號或類似的ID。所有收到的ARP包都被傳送到所有ARP套接字。

在你的情況:線程應該只挑選想要的數據包並忽略其他數據。

編輯: 您可以循環直到收到想要的ARP響應數據包。這樣:

while (!time_out) 
{ 
    <receive next ARP packet> 

    if (arph->ar_tip == wanted_ip) 
    { 
     // This is correct one. Handle it and break out from the loop. 
     <process the package> 
     break; 
    } 
    else 
    { 
     // This is not for me, ignore it silently. 
    }  
} 
+0

請你再解釋一下我明白了爲什麼我得到了這個問題,但我不明白你選擇想要的數據包與線程是什麼意思。謝謝你的答案 –

+0

@Emil Grigore:添加簡化的例子到答案。 – SKi

相關問題