- ベストアンサー
ソケットインタフェースに関して
クライアント/サーバ間でTCP/IPソケットのプロトコルを使用してネットワークを構築しようとしています。 TCP/IPソケットで、最初のクライアントAからconnectされた状態でクライアントBから同一ポートにconnectされた場合、クライアントBからのconnectを有効にしたいと考えています。本場合、他のクライアントからconnectされたことがTCP/IP層で検知可能でしょうか?また、アプリケーション層での作りは、どのようにすればよいか知っている方教えて下さい。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
select() もしくは accept() で socket が接続保留されているかどうか分かります。 クライアントAからの接続を維持し、クライアントからの電文を受け付ける状態にしつつ クライアントBからの接続を待つのであれば、それぞれを別スレッド、もしくは、別プロセスにする 必要がありますね。
その他の回答 (1)
- a-kuma
- ベストアンサー率50% (1122/2211)
> 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() する といった感じになると思います。 # もちろん、スレッドを使ったり、いろいろな組み合わせはあると思います
お礼
ありがとうございます。 listen()でデータ入力を待っている最中にクライアントBからのconnectは、そもそもTCP/IP層でエラーとなる気がしますが、後でconnectしてきたクライアントとconnectすることは可能ですか?