2013-01-10 1 views
0

나는 많은 자식 프로세스를 만들고 있으며, 모든 자식은 모든 자식에 대해 다른 IP를 가진 arp 패키지를 만들고, 패키지를 보내고, 해당 IP를 가진 시스템으로부터 패키지를 받는다. 그 기계가 on.The 문제는 내가 올바르게 (내가 wireshark로 확인) 패키지를 보낼 수 있지만 왜, 내 모든 자식 프로세스가 동일한 패키지를 받을지 모르겠다.리눅스의 자식 recvfrom은 정상적으로 작동하지 않는다.

예를 들어 192.167.0.1,88.4.3.2와 100.20.3.20이 있습니다. 첫 번째 IP는 good.I는 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

일부 코드가 추가되었습니다. 소켓 때문일 수도 있습니까? –

+0

원시 소켓에는 연결이 없으므로 수신자는 보낸 패킷과 관련된 패킷뿐만 아니라 모든 패킷을받습니다. – Barmar

답변

1

ARP 패킷에는 대상 응용 프로그램을 설명하는 포트 번호 나 유사한 ID가 없습니다. 따라서 수신 된 모든 ARP 패키지가 모든 ARP 소켓에 전달됩니다.

당신의 경우 : 스레드는 원하는 패킷 만 선택하고 다른 패킷은 무시해야합니다.

EDIT : 원하는 ARP-respone 패킷이 수신 될 때까지 루프 할 수 있습니다. 이 방법은 다음과 같습니다.

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

@ 에밀 Grigore : 추가 된 단순 예제 답에. – SKi

관련 문제