- ベストアンサー
INETDでのソケット非ブロックに設定するには?
Windows2000からソケット通信を行い、 Solaris9のC言語プログラムでデータを受信します。 その際にinetdを使用して、UNIX ServerのAPを起動 してそのAPで受信(rcve)するのですが、 通信障害を考慮して、非ブロックモードで行いたいのですが、私が調べる限りだと、受け側(Server AP)で、接続する 前にfcntlとかでソケットまたはフラグを取得して接続する とのことです。 只、inetdだと自動に行うため、どのタイミングで行っていいかわかりません。 inetd.confファイルとかで設定できるのでしょうか? お願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ソケットを非ブロックモードにするにはこんな感じでしょうか? http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-6.html#ss6.1 実際に受信データがあるかどうかはselect()を使うのが一般的と思います。 http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_3.html ところで、inetdを使った場合はソケットは標準入出力にリダイレクトされます。 従って、select()で標準入力を検査してデータがあれば1文字ずつread()する ようにすればいいかと思います。 http://www.fc-lab.com/network/program/inetd/index.html
その他の回答 (2)
- terra5
- ベストアンサー率34% (574/1662)
socketが既に作られているなら、solarisは知りませんが, 多分ioctlで同期,非同期で設定が可能でしょう。 Linuxだと http://www.linux.or.jp/JM/html/LDP_man-pages/man7/socket.7.html FIOASYNCでできると思います。 http://www.linux.or.jp/JM/html/LDP_man-pages/man2/fcntl.2.html fcntlのO_ASYNCでもいけたかな? 今まで私の使ったOSだと、socket作った後に何らかの方法で同期,非同期の設定が可能だったと思います。 タイミング的には,recv,sendする前ならいつでも可能です。 soralisについては、マニュアルをお調べください。
- terra5
- ベストアンサー率34% (574/1662)
inetdの動作は関係無いのでは? inetdがどうしようが、起動されるプログラムがソケットをオープンする際に、ブロック、非ブロックを設定するだけですから。 また、プログラムの方もどちらで動作するかで通常違った物になると思いますし。 それとも、inetd自体をブロック、非ブロックで動作を設定したいという意味でしょうか? inetdが内部的にどっちの設定になっているかは知りませんが、 古くからいろいろな状況で使われているプログラムですから、既に対策済みで気にする必要は無いと思います。
補足
すみません。私の勉強不足でわからないのですが、 INETDで受け側のAPを作成してるですが、受け側APは ソケットの生成からacceptまで自動でやってくれて、 send、recvができるのでどうしていいかわかりません?