繁体   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