- ベストアンサー
TCP/IPプログラミングでのselectについて
selectは使用しているソケットのディスクリプタを登録させれば、send、writeシステムコールからのデータの受信等は検知しますよね。 では、コネクション要求(connect)は、検知するのでしょうか? どなたか回答よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
もちろん検知しますよ。 LISTENしているソケットに対しての要求を検知したら acceptしてやればOKです。
その他の回答 (2)
- onti
- ベストアンサー率37% (9/24)
接続を待つ側は、ソケットを生成するときにTCPかUDPかを 指定してソケットを生成していたと思いますが? あと、ソケット処理の基本としては、接続を受ける側は 生成したソケットでlisten⇒selectを行った形でまつ ようになると思います。それに大して、相手がconnectした たら、selectで検知できます。selectの第1パラメータか なにかに接続待ちするポート番号を指定できたと思います が、そこらへんは間違っていませんか? もし、それでもだめなら、コマンドラインなどからnetstat コマンドで、生成して待ち状態にあるソケットの状態を 確認してみてはどうでしょうか?それで待ち状態になって いるのでselectがこないというのであれば、接続待ちの ほうではなく接続しようとしているほうに問題があるので はないかと思いますが。
お礼
うまくできました。 今までできなかったのは送信側のポート番号設定が間違っていたのが原因でした。 御指摘等、ありがとうございます。(^^)
- furlong
- ベストアンサー率50% (17/34)
できますが、面倒くさいです。覚悟してください。 先ず、ioctlかfcntlでソケットをnon-blockingモードにしてからconnectを呼びます。connectは必ずエラーで戻ってくるので、エラーを無視し、ソケットがライト可能になるのをselectで待ちます。ソケットがライト可能になったらgetpeername等でconnectの結果を調べます。成功していれば0、タイムアウト等で失敗しれば-1が戻ります。 ioctlやfcntlの仕様はシステムによって異なるので、マニュアルを見てください。キーワードは、O_NONBLOCK、O_NDELAY、FIOSNBIO等です。 なお、acceptについては簡単です。listenに渡したソケットがselectでリード可になれば、即座にacceptが可能です。
補足
selectでやってみましたがウマクいきませんでした。 検知もしてないようです。UDPと多重通信を試みているのですがポート番号がTCPとUDPで同じものを使うのはだめなのでしょうか?
補足
selectでやってみましたがウマクいきませんでした。 検知もしてないようです。UDPと多重通信を試みているのですがポート番号がTCPとUDPで同じものを使うのはだめなのでしょうか?