スタックオーバーフローユーザー!
p2p を処理する必要があるアプリがあり、それが UDP ホール パンチングに到達する方法です。しかし、私は実装に問題がありました。ヒントを教えてください。
完璧に機能し、クライアントを相互に紹介するサーバーを持っていますが、クライアントは、おそらくソケットを扱っている私の小さな経験のために接続できません。したがって、クライアントアルゴリズムは次のとおりです。
- UDP ソケットを作成します ( socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); )
- sendto関数を介してサーバーにメッセージを送信する
- recvfromロッカー関数を使用して、サーバーから応答を取得します
これらの 3 つの手順の後、ピア エンドポイントを取得します。次に、次の 2 つの方法でクライアントを接続しようとしました。
Way1 :
- 同じソケットを使用してsendto関数経由でピアにデータを送信しますが、別のsockaddrを渡します
- recvfromロッカー関数をリッスンします (その時点でWSAECONNRESETエラーが発生します)
Way2 :
- 新しいソケットを作成する
- バインドする
- ピアにデータを送信するために使用します
- 聞く
このように、1 つのクライアントがバインドに失敗し、別のクライアントがエラーWSAEADDRINUSEおよびWSAECONNRESETでリッスンに失敗します。私は明らかに何か間違ったことをしています。あなたの助けをいただければ幸いです。前もって感謝します。
PS Wanna は、UDP ホール パンチングに関する優れた記事を共有して、この手法に慣れていない人を支援します: http://www.brynosaurus.com/pub/net/p2pnat/