2011-01-08 31 views
2

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

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

問題があるのは、接続を確立してからUDPがrecvfrom()を使用しなければならないのに対し、サーバはポートフォワーディングを両方の方法で行う必要があるということです。 (マルチプレイヤーゲームやVoIPクライアントを見ている場合は不要です)クライアント側の最初の場所で開くことができます。

UDPホールパンチングに関する話題(例:http://en.wikipedia.org/wiki/UDP_hole_punching)例えば、彼らはサーバとのudp会話を開始することについて言及し続けている。これは問題です。クライアントがポートを開かなくても、実際にサーバーとUDP通信(両方向)を開始するにはどうすればいいですか?私はあなたが()サーバーに接続する必要があると述べたTCPで、通信は両方の方法が可能です。

また、私はUDP上でRTPビルドを知っていますが、UDPとは異なるRTPホールパンチング(再び、JRTPLIBを使用)について知っておくべきことがありますか?

ありがとうございます!

+1

私はちょっと混乱しています - UDPホールパンチングはNATトラバーサルのために行われます。つまり、ピアツーピアに接続する必要があり、両方のピアがプライベートネットワーク(またはルータ)として動作しています。サーバーは、2つのクライアントを「マッチメイキング」する方法としてのみ使用されます。それはあなたがやろうとしていることですか? – zebrabox

+0

クライアントにポートを開かせずに、サーバーに接続しているクライアント間でUDP/RTP接続を実現しようとしています。私が理解しているように、クライアントはIP /ポートをサーバと交換し、クライアント間で共有して、互いに直接通信できるようにします。 – KaiserJohaan

+0

「ポートを開く」とはどういう意味ですか?彼らが通信するために開かれた港がなければなりません、それはudpの穴あけがするものです。 – nos

答えて

3

「ポートを開く」という2つの可能な定義があります。 1つは、UDPの場合はbind()、TCPの場合はlisten()を使用してポートを開き、別のポートはファイアウォールのポートをオープンしています。

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

また、recvfrom()などのことをする必要はありません。 UDPソケットをバインド()してから、TCPと同じようにconnect()とrecv()/ send()またはread()/ write()を使うだけです。

+0

わかりました、それは意味があります。クライアントの場合、この接続のconnect()設定は必要ですか?それとも、ファイアウォールのために実際にそのポートでパケットの受信を受け入れる必要がありますか? – KaiserJohaan

+0

@Kaiser、いいえ、UDPはコネクションレスなプロトコルなので、connect()コールはすべて、送信または受信するデフォルトのアドレスを設定するだけで、毎回指定する必要はありません。だから最初に何かを送る必要があります。 –

+0

を参照してください。ありがとう、これを試してみるよ! – KaiserJohaan

関連する問題