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 回答