• ベストアンサー

TCP/IPプログラミングでのselectについて

selectは使用しているソケットのディスクリプタを登録させれば、send、writeシステムコールからのデータの受信等は検知しますよね。 では、コネクション要求(connect)は、検知するのでしょうか? どなたか回答よろしくお願いします。

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

  • ベストアンサー
  • gaball
  • ベストアンサー率61% (27/44)
回答No.1

もちろん検知しますよ。 LISTENしているソケットに対しての要求を検知したら acceptしてやればOKです。

SafeGuard
質問者

補足

selectでやってみましたがウマクいきませんでした。 検知もしてないようです。UDPと多重通信を試みているのですがポート番号がTCPとUDPで同じものを使うのはだめなのでしょうか?

その他の回答 (2)

  • onti
  • ベストアンサー率37% (9/24)
回答No.3

接続を待つ側は、ソケットを生成するときにTCPかUDPかを 指定してソケットを生成していたと思いますが? あと、ソケット処理の基本としては、接続を受ける側は 生成したソケットでlisten⇒selectを行った形でまつ ようになると思います。それに大して、相手がconnectした たら、selectで検知できます。selectの第1パラメータか なにかに接続待ちするポート番号を指定できたと思います が、そこらへんは間違っていませんか? もし、それでもだめなら、コマンドラインなどからnetstat コマンドで、生成して待ち状態にあるソケットの状態を 確認してみてはどうでしょうか?それで待ち状態になって いるのでselectがこないというのであれば、接続待ちの ほうではなく接続しようとしているほうに問題があるので はないかと思いますが。

SafeGuard
質問者

お礼

うまくできました。 今までできなかったのは送信側のポート番号設定が間違っていたのが原因でした。 御指摘等、ありがとうございます。(^^)

  • furlong
  • ベストアンサー率50% (17/34)
回答No.2

できますが、面倒くさいです。覚悟してください。 先ず、ioctlかfcntlでソケットをnon-blockingモードにしてからconnectを呼びます。connectは必ずエラーで戻ってくるので、エラーを無視し、ソケットがライト可能になるのをselectで待ちます。ソケットがライト可能になったらgetpeername等でconnectの結果を調べます。成功していれば0、タイムアウト等で失敗しれば-1が戻ります。 ioctlやfcntlの仕様はシステムによって異なるので、マニュアルを見てください。キーワードは、O_NONBLOCK、O_NDELAY、FIOSNBIO等です。 なお、acceptについては簡単です。listenに渡したソケットがselectでリード可になれば、即座にacceptが可能です。

SafeGuard
質問者

補足

selectでやってみましたがウマクいきませんでした。 検知もしてないようです。UDPと多重通信を試みているのですがポート番号がTCPとUDPで同じものを使うのはだめなのでしょうか?

関連するQ&A