ソケット通信でサーバー1台とクライアント5台が共通のポート番号で通信するとします。

クライアントaから送信されたデータをサーバーで中継して、クライアントcだけに指定して転送したりできるのでしょうか?

すべてのクライアントに送信して自分宛のものか判定するのは無しとします。
クライアント同士での通信は行わずに必ずサーバーを中継するものとします。

もしできない場合は、共通のポートではなく、クライアントごとにポートを変更するのでしょうか?

回答の条件
  • 1人2回まで
  • 登録:2010/08/28 16:42:43
  • 終了:2010/09/01 15:38:49

回答(2件)

id:loio No.1

loio回答回数342ベストアンサー獲得回数502010/08/28 17:59:25

ポイント35pt

やりたいことの構成がいまひとつ不明ですが、サーバがそういう風に振舞うようプログラムを書けば可能です。

ソケット通信の層では、相手がサーバかクライアントかどのPCかは区別はしません。

相手がだれか特定したり、特定した相手によって挙動を変えたりするのはアプリケーションの仕事です。パケットを中継することもそうです。ですのでアプリケーションをそう書けばできすし、要求仕様に無理や矛盾がなければそう難しいことでもありません。

id:monyot No.2

monyo回答回数146ベストアンサー獲得回数182010/08/28 18:58:54

ポイント35pt

「データの中継」が可能か不可能かでいえば、「可能」ですが、別の方もおっしゃっているように、ソケット通信の設定で行うことではなく上位のアプリケーションで行う必要があります。クライアントaからの通信は、常にクライアントcに転送するのであれば、サーバ側で送信元のIPアドレスを判別して、クライアントcに中継すればよいでしょうし、ケースバイケースで行いたいのであれば、アプリケーションレベルで作りこむことになります。

逆にいうと、ソケット通信の設定などの範疇で可能かといわれれば、「不可能」ともいえます。

「パケットの中継」が可能かといわれればやはりソケット通信の設定としては不可能ですが、たとえば Linux であれば、iptables を駆使して透過型プロキシの機能を使えば「クライアントaからのパケットを常にクライアントcの指定ポートに転送」することは可能です。

なお、「共通のポート番号で通信」と記載していますが、送信用のポートと受信用のポートは別にする必要があることはご存知ですよね。もう少し技術的なところを確認して、何をやりたいかを明確化させることをお勧めします。

  • id:h_kondo
    a->server (接続時にforkして、接続状態を維持) aプロセスとします。
    c->server (接続時にforkして、接続状態を維持) cプロセスとします。
    aプロセスとcプロセスの間でプロセス間通信を行ってデータを引き渡します。

    簡単にかくとこんな感じです。
    頑張ってください。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません