2016-12-02 4 views
0

udpリクエストをstun.l.google.com:19305に送信しましたが、google stunサーバーからの返信はありません。このコードでは、すべてのエラーチェックを省略します。私のプログラムは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

関連する問題