2013-03-14 5 views
0

들어오는 패킷을 청취하기 위해 UDP 소켓을 열었습니다. wireshark 로그에서 NIC에 도달하는 패킷을 볼 수있었습니다. 그러나 Socket을 통해 읽을 때도 마찬가지입니다. 'netsatat'명령은 들어오는 UDP 메시지에 대해 포트 번호가 수신되는 것을 보여줍니다. 소켓 리더는 계속 대기합니다. 리눅스 (우분투) 환경에서 Java와 C를 사용하여 확인했습니다. 받은 IPV4 패킷의 Identification 값이 0임을 알 수 있습니다.이 값은 소켓에서 데이터를 읽는 역할을 할 수 있습니까? 소켓을 읽어 내 C 코드NIC에서 수신 한 패킷이 소켓을 통해 읽을 수 없음

int sock, n, nr; 
socklen_t fromlen; 
struct sockaddr_in server; 
struct sockaddr_in from; 
sock = socket(AF_INET, SOCK_DGRAM, 0); 
if (sock < 0) 
printf("Can not create socket in server\n"); 
memset(&server, 0, sizeof(struct sockaddr_in)); 
server.sin_family = AF_INET; 
server.sin_port = htons(5555); 
server.sin_addr.s_addr = INADDR_ANY; 
if(bind(sock, (struct sockaddr *)&server, sizeof(server)) < 0) 
fromlen = sizeof(struct sockaddr_in); 
while(1) {  
    printf("Waiting to receive\n"); 
    n = recvfrom(sock, &nr, sizeof(nr), 0, (struct sockaddr *) &from, &fromlen); 
    printf("I have received"); 
} 

Wireshark를 추적 http://imgur.com/Au9BeS1

+1

당신이하는 일을 보지 않고는 아무 말도 할 수 없습니다. 우리에게 보여주기 위해 [SSCCE] (http://sscce.org/)를 만드십시오. –

+0

@JoachimPileborg가 추적 코드와 링크를 추가했습니다. 자세한 내용이 필요하면 알려주십시오. –

답변

1

을 찾아주세요이 문제입니다 :

if(bind(sock, (struct sockaddr *)&server, sizeof(server)) < 0) 
fromlen = sizeof(struct sockaddr_in); 

이는 fromlen을 설정합니다이 bind 전화 됩니다이 실패합니다. fromlen은 제대로 초기화되지 않았기 때문에 recvfrom에 유효하지 않은 임의의 값이 포함됩니다.

+0

바인드가 잘 작동하는 것 같습니다. 플래그가있는 IP 패킷을 수신 할 수 있습니다. 단편화를 0으로 설정하지 마십시오. 단 단편 = 1 인 경우 패킷은 이더넷에 도달하지만 응용 프로그램에는 도달하지 못합니다. 이것을 디버깅하는 좋은 방법이 있습니까? IP의 패킷 길이가 820이고 eth0의 MTU 크기가 1500 –

+0

입니다. @ bindanthmahadevan 예, 'bind' 호출이 작동하지만'fromLen'이 설정되지 않습니다. 들여 쓰기 또는 들여 쓰기 때문에 볼 수 없을 수도 있습니다. 또한'bind'가 실패하면 ('socket' 호출과 마찬가지로) 아무 일도 일어나지 않을 것입니다. –

관련 문제