0

私はたくさんの子プロセスを作成しています。すべての子は、子ごとに異なる 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;

}

何かをチェックするためだけに使用する情報構造体に感謝します。

4

1 に答える 1

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.
    }    
}
于 2013-01-10T08:18:01.257 に答える