2013-04-12 2 views
5

私はUDPサーバー/クライアントアプリケーションで書いています。40個の異なるIPアドレスに40個のソケットをバインドする

私は、一度に1台のサーバで40クライアントを処理したいと思っています。このために、40個の専用スレッドを作成したいと思います。クライアントごとに40個のスレッドがあるので、40個の専用ソケットも作成したいと考えています。

しかしという問題:私は40 IPは、私が)(私のソケットをバインドするものとするためにどのアドレスになるかわからない

。 (私の今のところ、私のサーバのIPアドレスにbind()しなければならないからです)。通常はソケットが1つだけの場合は"INADDR_ANY"にバインドします。

しかし、40個のソケットごとにバインドするIPアドレスは何ですか? 私を助けてください。どんなコメント/助けもありがとうございます。

+0

40個のソケット(ソケットアドレス)または40個のIPアドレスが必要ですか?あなたのホストにはたくさんのものがありますか? –

答えて

2

1つの一般的な方法は次のとおりです。既知のポートへ

  • サーバーのバインド()。
  • クライアントは、その既知のポートに初期パケットを送信します。
  • サーバは、既知のポートのクライアントから最初のパケットを受信します。
  • サーバーは、ランダムなポートで新しいソケットを作成します。
  • サーバーは、この新しいソケットからクライアントに応答します。
  • クライアントはよく知られている サーバーポート以外のポートからの通知を受け取り、そのポートをさらに通信の宛先として使用します。

getpeername()呼び出しを使用してリモートアドレスを確認します。

UDPはコネクションレスであることを覚えておいてください。ソケットの終了やタイムアウトを通知する方法が必要です。

1

通常の方法は、socketと​​着信接続です。bindです。各接続にはacceptによって一意のソケットが割り当てられます。

UDPを使用しているので、クライアントにそれぞれのサーバーUDPアドレスを知らせるために、上記のようにTCPを使用します。

+1

UDPで作業している間は、accept()はtcp用です。 – Ayse

+0

私のシステムでは40個のソケットを作成する必要があります。今、問題は、私がIPアドレスがこれらの40ソケットにバインドされなければならないことを知らないということです:( – Ayse

+0

@Ayesha Hassen:私はUDPにアドレスする答えを増やしました。 –

2

bindには、リモートアドレスではなくローカルアドレスのみが必要です。

クライアントごとに1つのソケットが必要な場合は、それぞれに異なるポートを使用する必要があります(bindを使用)。こうすることで、各クライアントはトラフィックを専用ポートに送信でき、ソケット/ポートごとにスレッドを持つことができます。

1つのソケット(および1つのポート)しか持たず、リモートアドレス(例えばrecvfromなどを使用して取得)に基づいてスレッドにトラフィックを割り当てるロジックがコード内にあります。 UDPでこれを行うには

+0

ただ1つのスレッドしかなく、 40クライアントがこのソケットで同時にデータを送信すると、各クライアントのデータが破棄される可能性があります。 この理由から、クライアントごとに専用ソケットを作成する方向に移行しました。 – Ayse

+1

専用ソケットが本当に必要な場合は、 –

+0

あなたの助けを感謝します:)本当に私を助けました:) 私が知りたいことは、 1つのリスニングスレッドではなく40スレッド/ソケットを作成する場合の短所があります。すべての人がこの考えに反するようです。これにはいくつかの確かな理由がありますか?なぜ、クライアントごとに専用のスレッド/ソケットを40個作成しないでください。一つのソケットの作成に専念すべきですか? : – Ayse

1

専用のリスニングスレッドで単一のリスニングソケットを作成します。

新しいパケットを受信した場合は、パケットのリモートaddr/portを使用するか、パケットペイロードに一意のclientIDを設定して、クライアントを一意に識別します。

このクライアント用の新しいスレッドをまだ作成していない場合は作成し、それ以降の処理のためにそのスレッドにパケットを渡して、リスニングに戻ります。

特定のクライアントスレッドがしばらくの間パケットを受信しなかった場合、それ自体を終了することができます。

関連する問題