アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (2件)

select() もしくは accept() で socket が接続保留されているかどうか分かります。



クライアントAからの接続を維持し、クライアントからの電文を受け付ける状態にしつつ
クライアントBからの接続を待つのであれば、それぞれを別スレッド、もしくは、別プロセスにする
必要がありますね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/02/13 17:47

> 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() する


といった感じになると思います。

# もちろん、スレッドを使ったり、いろいろな組み合わせはあると思います
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!