• ベストアンサー

ソケットインタフェースに関して

クライアント/サーバ間でTCP/IPソケットのプロトコルを使用してネットワークを構築しようとしています。 TCP/IPソケットで、最初のクライアントAからconnectされた状態でクライアントBから同一ポートにconnectされた場合、クライアントBからのconnectを有効にしたいと考えています。本場合、他のクライアントからconnectされたことがTCP/IP層で検知可能でしょうか?また、アプリケーション層での作りは、どのようにすればよいか知っている方教えて下さい。

質問者が選んだベストアンサー

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

select() もしくは accept() で socket が接続保留されているかどうか分かります。 クライアントAからの接続を維持し、クライアントからの電文を受け付ける状態にしつつ クライアントBからの接続を待つのであれば、それぞれを別スレッド、もしくは、別プロセスにする 必要がありますね。

pipi-tan
質問者

お礼

ありがとうございます。 listen()でデータ入力を待っている最中にクライアントBからのconnectは、そもそもTCP/IP層でエラーとなる気がしますが、後でconnectしてきたクライアントとconnectすることは可能ですか?

その他の回答 (1)

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

> listen()でデータ入力を待っている最中にクライアントBからのconnectは、そもそもTCP/IP層でエラーとなる気がしますが ん? listen() は、クライアントAからの接続が済んでいるのだから、もう必要ないですよね。 ちょっといいかげんですが、簡単にサーバのプログラムの構造と、処理の流れを書いてみます。 クライアントとの通信処理を、サーバの子プロセスとして処理するやり方を使います。 ■サーバのプログラム構造   /* 準備 */   socket()   bind()   listen()   ioctl() /* 必要なら */   /* 接続待ち */   while (accept()) {     /* 通信処理:socket を使ってクライアントとやりとり */   } ■処理の流れ ・サーバ側の準備を済ませ、while の accept() で接続待ちになる ・クライアントAから connect() されると accept() から返ってくる ・子プロセスを fork() し、そこで返ってきた socket を使ってクライアントAとやりとりをする ・親プロセスは fork() し終わると、while() の accept() で次の接続を待つ ・親プロセスでは、後でクライアントAと会話しているプロセスを殺すためにプロセスIDを保存しておく ・クライアントBから connect() されると accept() から返ってくる ・クライアントAと会話しているプロセスを殺す ・クライアントBと会話するための子プロセスを fork() する といった感じになると思います。 # もちろん、スレッドを使ったり、いろいろな組み合わせはあると思います

関連するQ&A

専門家に質問してみよう