2

クライアント/サーバーボイスチャットプログラム(アンマネージドC ++、win32)を実行しています。このプログラムでは、クライアントはTCPを使用してサーバーに接続し、テキストチャット/チャットルーム機能はTCPで実行され、すべての音声送信は別のUDP / RTPソケットを介して送信されます(APIを使用) JRTPLIBから)。

したがって、IPはTCP接続から認識され、接続が確立された後にRTPソケットのポート番号を送信できます。

問題は、TCPでは、接続を確立してから通信が双方向で機能するためにサーバーのみがポート転送を行う必要があるのに対し、UDPではrecvfrom()を使用する必要があることです。これはafaikでポートを開く必要があります。私が望まないクライアント側の最初の場所(そして、マルチプレイヤーゲームやVoIPクライアントを見る場合は必要ありません)

たとえば、UDPホールパンチングについて説明しているソース(たとえば、http://en.wikipedia.org/wiki/UDP_hole_punching)を読んで、サーバーとのudp会話の開始について言及し続けています。それが問題です-クライアントがポートを開かなくても、実際にサーバーとudp会話を(双方向で)開始するにはどうすればよいですか?TCPでは、前述したように、サーバーにconnect()するだけで、双方向の通信が可能です。

また、RTPはUDPに基づいて構築されていることは知っていますが、UDPとは異なるRTPホールパンチング(ここでもJRTPLIBを使用)について知っておくべきことは他にありますか?

前もって感謝します!

4

1 に答える 1

3

「ポートを開く」には2つの定義があります。1つはUDPの場合はbind()、TCPの場合はlisten()でポートを開くことで、もう1つはファイアウォールでポートを開くことです。

何かを受け取るにはAPI呼び出しでポートを開く必要があり、それを回避する方法はありませんが、おそらくこれを認識しているので、ファイアウォールでポートを開くことを意味していると思います。ただし、通信を開始する側(クライアント)でこれを行う必要はありません。これは、ファイアウォールが非常にパラノイドモードに設定されていない限り、TCPとUDPの両方に適用されます。以前にこのポートから同じサーバーにデータグラムが送信された場合、適切なファイアウォールであれば、サーバーからUDPポートへの応答が可能になります。両側がNATファイアウォール/ルーターの背後にある場合にのみ、穴を開ける必要があります。それがSkypeのやり方です。

さらに、recvfrom()などを気にする必要もありません。UDPソケットをbind()してから、TCPの場合とまったく同じ方法でconnect()とrecv()/ send()またはread()/ write()を使用できます。

于 2011-01-08T19:05:25.627 に答える