2013-08-30 6 views
0

나는 recvfrom를 사용하여 Windows 8에서 몇 가지 문제가 있습니다. INADDR_ANY (0.0.0.0)에 바인드 된 소켓이 있는데, 그 중 일부 패킷을 받고 싶습니다.아무것도 recvfrom 창문에서받은

문제는 내가 Wireshark에있는 패킷을 보았지만 recvfrom은 수신 된 크기가 0보다 크지 않다는 것을 결코 알려주지 않는다. 127.0.0.1 또는 심지어 로컬 IPv4 주소로 소켓을 전송하려 시도했지만 결코 아무것도 얻지 마라. 사용 된 포트는 7321 (로컬)입니다.

소켓 생성에 ENet 라이브러리를 사용하고 recvfrom에이 소켓을 사용했습니다. 다음은 예상 패킷을 반환하지 않는 코드입니다. 내가 말했듯이 Wireshark를 나에게 (당신이 알고 싶다면 STUN 응답이다) 패킷을 같이

uint8_t* buffer; // max size needed normally (only used for stun) 
buffer = (uint8_t*)(malloc(sizeof(uint8_t)*2048)); 
memset(buffer, 0, 2048); 

socklen_t from_len; 
struct sockaddr addr; 

from_len = sizeof(addr); 
int len = recvfrom(m_host->socket, (char*)buffer, 2048, 0, &addr, &from_len); //m_host is of type ENetHost, the socket in it is a file descriptor like standard sockets 

, 그것은 조금 이상해.

누군가이 문제를 일으킬 수있는 누락 된 부분을 찾도록 도와 줄 수 있습니까?

1) 당신은 올바른 포트를 가지고하지 않을 수 있습니다 sendto를 &에 recvfrom 소켓 :

+0

Wireshark가 패킷을보고하고 응용 프로그램이 수신 중이지만 패킷을 수신하지 않은 비슷한 문제가 최근 발생했습니다. 라우팅 테이블이었습니다. 어쩌면 그건 너의 문제 야? (리눅스에 있었기 때문에 Windows에서 확인 또는 수정하는 방법을 모르겠습니다.) –

답변

0

addr 변수는 sockaddr으로 선언되어 있습니다. sockaddr_in (IPv4에서만 작동) 또는 SOCKADDR_STORAGE (IPv4와 IPv6 모두에서 작동)으로 선언 된 다음 recvfrom()으로 전달할 때 sockaddr*으로 타이프 캐스트해야합니다.

이외에도 recvfrom()은> = 0을 반환하지 않는다고합니다. 실제로 반환되는 것은 무엇입니까? 0을 반환하면 길이가 0 인 패킷이 수신되었습니다 (TCP에서는 불가능하지만 UDP에서는 가능). -1 (일명 SOCKET_ERROR)을 반환하면 오류가 발생하므로 WSAGetLastError()을 사용하여 실제로 오류가 무엇인지 확인하십시오.

+0

안녕하세요, 도와 주셔서 고맙습니다 : 첫 번째 : sockarrd_in을 사용하면 recvfrom 함수가 sockaddr *을 다섯 번째 매개 변수가 아닌 sockaddr_in * 초만큼 기다리기 때문에 어쩌면 도움이되지 않습니다. 항상 -1을 반환합니다. WSAGHetLastError()를 시도해보고 결과가 무엇인지 알려줄 것입니다. 'IPv4의'sockaddr_in' - – hilnius

+0

나는 오류 "비 블로킹 소켓 작업을 즉시 완료 할 수 없습니다" – hilnius

+0

우선'에 recvfrom()'는 기본 소켓 유형과 일치 무엇이든하고자하는'sockaddr'을 원하지 않는이 sockaddr_in6'을 IPv6 등으로 사용합니다. 6 번째 매개 변수보다 실제로'sockaddr'가 필요한 경우 5 번째 매개 변수가 실제로 가변 길이이기 때문에 존재하지 않습니다. 둘째, 'WSAGetLastError()'는 문자열이 아닌 오류 코드를 제공합니다. 당신이 말한 에러 메시지는 에러 코드로'WSAEWOULDBLOCK' (10035)을 얻고 있다는 것을 암시합니다. 비 블로킹 소켓을 사용하고 그 순간 읽을 수있는 데이터가 없다면 완벽하게 정상입니다. –

0

나는 두 가지 이유 당신은 문제가있는 생각할 수 있습니다. 따라서 포트 6000으로 패킷을 보내고 있지만 recvfrom은 포트 6001이나 다른 포트에서 수신합니다. 두 프로그램이 동일한 포트를 사용하고 있는지 다시 확인하십시오.

2) Windows 방화벽. 나는 안전을 위해서 관리자로 프로그램을 운영 할 것이지만 Windows 방화벽을 통한 프로그램이 개인 또는 공용 네트워크를 사용하여 통신 할 수 있도록해야합니다.

+0

모든 방화벽 (antivir + windows)을 비활성화하고 포트를 검사 해 보았습니다. 소켓은 분명히 0.0.0.0:7321에서 수신 대기 중이며 wireshark는 패킷이 포트 7321에 도착하고 목적지 IP가 192.168.0.11 (내 로컬 IP 주소)임을 알립니다. – hilnius