select処理で標準入力を識別させるには?

解決


redrightgirl  2003-09-12 10:54:02  No: 52140  IP: [192.*.*.*]

初めまして。
当方、VC++6(OS:W2k)を用いコンソールアプリ上で動作する
簡単なソケットプログラムを書いております。

メッセージの送受信にrecv/sendを用いると、プログラムが
ブロックされるということから、selectを用いる処理に切り替えました。
参考にしている書籍では、キーボードの入力処理も同様に扱っている
のですが、当方の環境では、この入力処理をselectで行うと誤動作の
原因になるようです。
そもそも、参照している書籍がUNIX系OS上を前提に記載されており
注釈では、winsockなどを使う場合は、標準入出力処理等はselectで
処理できないとありました。
  書籍どおり行えないものなのでしょうか?
また、その場合、代わりの手段などはどういったものが考えられます
でしょうか?
  ご教授よろしくお願い致します。

編集 削除
YuO  2003-09-12 13:57:47  No: 52141  IP: [192.*.*.*]

Windowsでは無理です。
select自体がWinSockのAPIですから。

基本的に設計からやり直す必要があります。


方法論としては,
・スレッドを使う
・Overlapped I/Oを使う(NT only)
があります。


スレッドを使うというのは,標準入力からの入力処理とソケットの入出力処理を分離して,
ブロッキングしても他方に影響を及ぼさないようにする,という方法です。

同期などの問題が出てくるので面倒ですが,NT系/95系どちらでも使うことができます。


Overlapped I/Oを使うというのは,イベントオブジェクトなどを利用して,
処理が終了したことを知る方法です。この方法ではブロッキングは起きません。
#ちゃんと処理すれば,ですが。

NT系でのみ利用可能ですが,同期の問題はなくなります。
#ReadFile/ReadConsole APIでOverlapped I/Oは95系のサポート無し。

編集 削除
redrightgirl  2003-09-12 14:48:43  No: 52142  IP: [192.*.*.*]

Yuoさん、ご返信有難うございます。

>Windowsでは無理です。
>select自体がWinSockのAPIですから。
>基本的に設計からやり直す必要があります。

質問後にもいろいろ試してみましたが、純粋なselect処理には
到達せず、標準入力周りをスレッドで処理しないといけないかな
と考えておりました。
お蔭様でここ数日悩んでいた問題が解決しました。

>・Overlapped I/Oを使う(NT only)

こちらの方法も折角ですので勉強してみたいと思います。

有難うございました。

編集 削除