初めまして。
当方、VC++6(OS:W2k)を用いコンソールアプリ上で動作する
簡単なソケットプログラムを書いております。
メッセージの送受信にrecv/sendを用いると、プログラムが
ブロックされるということから、selectを用いる処理に切り替えました。
参考にしている書籍では、キーボードの入力処理も同様に扱っている
のですが、当方の環境では、この入力処理をselectで行うと誤動作の
原因になるようです。
そもそも、参照している書籍がUNIX系OS上を前提に記載されており
注釈では、winsockなどを使う場合は、標準入出力処理等はselectで
処理できないとありました。
書籍どおり行えないものなのでしょうか?
また、その場合、代わりの手段などはどういったものが考えられます
でしょうか?
ご教授よろしくお願い致します。
Windowsでは無理です。
select自体がWinSockのAPIですから。
基本的に設計からやり直す必要があります。
方法論としては,
・スレッドを使う
・Overlapped I/Oを使う(NT only)
があります。
スレッドを使うというのは,標準入力からの入力処理とソケットの入出力処理を分離して,
ブロッキングしても他方に影響を及ぼさないようにする,という方法です。
同期などの問題が出てくるので面倒ですが,NT系/95系どちらでも使うことができます。
Overlapped I/Oを使うというのは,イベントオブジェクトなどを利用して,
処理が終了したことを知る方法です。この方法ではブロッキングは起きません。
#ちゃんと処理すれば,ですが。
NT系でのみ利用可能ですが,同期の問題はなくなります。
#ReadFile/ReadConsole APIでOverlapped I/Oは95系のサポート無し。
Yuoさん、ご返信有難うございます。
>Windowsでは無理です。
>select自体がWinSockのAPIですから。
>基本的に設計からやり直す必要があります。
質問後にもいろいろ試してみましたが、純粋なselect処理には
到達せず、標準入力周りをスレッドで処理しないといけないかな
と考えておりました。
お蔭様でここ数日悩んでいた問題が解決しました。
>・Overlapped I/Oを使う(NT only)
こちらの方法も折角ですので勉強してみたいと思います。
有難うございました。