簡體   English   中英

linux child recvfrom無法正常工作

[英]linux child recvfrom not working as it should

我正在做一堆子進程,每個孩子都必須為每個子進程制作一個具有不同IP的arp程序包,發送該程序包,並從具有相應IP的計算機接收程序包(如果該計算機已打開)。問題是我正確發送軟件包(我用wireshark進行了檢查),但我不知道為什么,我的所有子進程都收到相同的軟件包。

例如我有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;

}

我使用的只是信息結構,只是用來檢查某些東西。

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.
    }    
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM