2016-12-02 1 views
0

udp 요청을 stun.l.google.com:19305에게 보내지 만 Google 기절 서버에서 응답을받지 못했습니다. 이 코드 조각에서 오류 검사를 모두 생략했습니다. 내 프로그램이 recvfrom에 있습니다.STUN 바인딩 요청이 잘못되었습니다.

int stun_socket = socket(AF_INET, SOCK_DGRAM, 0); 

struct sockaddr_in stun_client; 
memset(&stun_client, 0, sizeof(stun_client)); 

stun_client.sin_family = AF_INET; 
stun_client.sin_port = htons(local_port); 

int rc = bind(stun_socket, (struct sockaddr *)&stun_client, sizeof(stun_client)); 

struct sockaddr_in stun_server; 
memset(&stun_server, 0, sizeof(stun_server)); 

stun_server.sin_family = AF_INET; 
stun_server.sin_port = htons(remote_port); 
inet_pton(AF_INET, server, &stun_server.sin_addr); 

typedef struct stun_header_tag { 
    uint16_t message_type; 
    uint16_t message_length; 
    unsigned char transaction_id[16]; 
} stun_header_t; 

stun_header_t header; 
header.message_type = htons(0x0001); /* Binding Request */ 
header.message_length = htons(0); 
*(int *)(&header.transaction_id[8]) = 0xFFEEFFEE; /* transaction id in the response should keep consistent with this one */ 

rc = sendto(stun_socket, (void *)&header, sizeof(header), 0, (struct sockaddr *)&stun_server, sizeof(stun_server)); 

char response[64]; 
rc = recvfrom(stun_socket, response, 64, 0, NULL, 0); 

답변

0

난 당신이 데이터 전송이 유사하거나 동등한 뭔가 일을 추측하고있어 : 그런 경우

sendto(sock, &header, sizeof(header), (sockaddr*)&addr, addrlen); 

을, 당신은 가능성 (바이트 순서를 네트워크에 message_type 값을 변환하는 것을 잊었다 빅 엔디안).

header.message_type = htons(0x0001); 

을하지만 당신은 더 나은 솔루션을 원한다면, 당신은, C++를 사용 Stuntman에 내장 된 클라이언트 라이브러리를 사용할 수 있습니다

이보십시오. stuncore/stunbuilder.h 파일에 선언 된 C++ 클래스 인 CStunMessageBuilder를 사용하여 다음과 같이 바인딩 요청을 생성 할 수 있습니다.

CStunMessageBuilder builder; 
StunTransactionId transId; 

builder.AddBindingRequestHeader(); 
builder.AddRandomTransactionId(&transID); 
unsigned char* msg = builder.GetStream().GetDataPointerUnsafe(); 
size_t len = builder.GetStream().GetSize(); 

sendto(sock, msg, len, (sockaddr*)&addr, addrlen); 
+0

답장을 보내 주셔서 감사합니다.하지만 원격 서버에서 응답이 없습니다. 코드 조각을 붙여 넣으십시오. – CharlesLiuChina

+0

서버에 대해 실행중인 코드의 tcpdump 또는 wireshark 추적을 가져 와서 링크를 보내주십시오. – selbie

+0

위의 링크에서 코드를 컴파일하십시오. 'stunclient stun.l.google.com 19305'를 실행하여 생성 된 트레이스와 트레이스를 비교할 수 있습니다. – selbie

관련 문제