2011-01-09 60 views
0

まず、「別のソフトウェアのポートにバインドする方法」の問題ではありません。いくつかのUDPソケットは、同じポートにバインドされていますか?

今、私はTCPに基づいて、クライアントサーバーアプリケーションを持っていると私はそれUDPしたいのですが、私は何かが欠けています。..

私はこれまで(私は入れ)2つのルールを持っていますアプリケーション:
1)「サーバー」は、ポート転送構成なしでルータの後ろにとどまることができます。
2)「クライアント」は1つのポートだけを聞くことができます。

TCPで

私はこのようにそれを行う:
1)サーバは、ポートX.
2)クライアントがサーバへの通信チャネルをオープンしたいときに依頼する最初のソケットを使用して上のクライアントへの初期接続をオープン新しいもの用のサーバー。
3)サーバーは新しいソケットを作成し、ポートXのクライアントに接続します。 4)クライアントはこの新しい接続をポートXで受け入れ、クライアントはこの新しいソケットでサーバーと通信します。

このように私は同じポート上で複数の接続を持つことができます。サーバは、クライアントがサーバーへの通信チャネルをオープンしたい場合には、要求を送信し、ポートX.
2)上のクライアントへの初期接続DGRAMを送信
1)

UDPで、私は少し問題を抱えています。..最初のソケットのaddrに新しいソケットを追加します。
3)サーバーはメッセージを受信し、新しいudpソケットを作成し、それを使用してポートXのクライアントにデータを送信します。
4)クライアントは新しいdgramを受け取ります。

基本的に私はこの接続を「受け入れる」ことを今起きたいと思っています。新しいUDPソケットを作成し、それをポートXにもバインドし、その特定の着信ソケットaddr(ip、port)からのデータだけを受け取ることを意味します。私は同じポートに複数のソケットをバインドすることはできませんので、私はそれを行うことはできません。
1つのポートに複数のudp接続を作成する方法は何ですか? UDPはコネクションレスプロトコルであるためステップ4であなたがUDPメッセージの内容を確認し、どのように決定し、

感謝:)

+1

UDPは「接続済み」プロトコルではなくデータグラムプロトコルであるため、UDPとの「接続」はできません。 – sfk

+1

と私はUDPの問題で "接続"という言葉を言っていないことに非常に注意しました。私が「接続」と言うとき、私は答えるための門を開くことを意味する。 だから私が望むのは、(外部からブロックされている)サーバーサイドだけで、UDP dgramをクライアントに送信するためです。クライアントは後でそのソケットにdgramを送信し、その特定のソケットからdgramを受け取ります) 同じポート上に新しいソケットをバインドして、必要な(ip、port)からのデータだけを受け取ることができました。 – RoeeK

+0

@sfk UDPはステートレスなプロトコルですが、connect()コールはソケット操作に大きな影響を与えます。例えば、FreeBSDでは、接続されていない限り、UDPソケットからのエラー(ICMPの宛先は到達不能など)を取得できません。 – WGH

答えて

4

を(方法ネットワーキングでは、だけでなくdgramsのリングバッファを作成して、右のソケットに送信します)それを処理する。言い換えれば、メッセージの種類はその内容によってのみ定義されます。

しかし、あなたの全体のデザインが少し間違っていると感じています。 クライアントがファイアウォールの背後にあるのは、サーバーよりもクライアントが多いからです。ファイアウォールの後ろにサーバーを置く必要がある場合は、ファイアウォールを構成して一連のポートに接続できるようにするだけです。ポートをもう1つ開いただけでも、クライアントが同じサーバーポートに複数回並行して接続することはできません。

+0

このソリューションは、ソフトウェアとプロトコルの設計を変更するだけで、各dgrarmには何をすべきかを示すヘッダーが表示されます。 私はデザインを変更しない何かを探しているので、私は簡単にTCPとUDPモードを切り替えることができます。 については、サーバークライアントの事.. "サーバー"は携帯電話..ですので、私は有効なIPを持っていません。 – RoeeK

+0

@RoeeKはい、あなたの現在の "デザイン"が最適ではないからです。 –

+0

サーバが有効なIPアドレスを持たないサーバ - クライアント通信を作成するより良い方法を考えることができません。それはなぜそれほど奇妙なのですか。クライアントがサーバーと話すことができるので、サーバーはクライアント側にソケットを開く必要があります。クライアント側をサーバーにします。したがって、私は最も明確な用語を入れます実際には両側はクライアントとサーバーです – RoeeK

関連する問題