6

私はいくつかのコードを BSD ソケットから Winsock に移植していますが、以下のケースの処理方法がわかりません。

私の元のアプリケーションは、stdin とネットワーク ソケットの両方で選択を実行します。

FD_SET(sock, &fd);
FD_SET(0, &fd);
...
if (select(..., &fd, ... )...)

これを Winsock で実行しようとすると、エラー 10038 (WSAENOTSOCK) が発生します。Linux ではファイル ハンドル 0 (stdin) であったものは、Windows ではソケット (より正確には SOCKET タイプ) ではないため、これは理にかなっています。

このテストを Windows ソケットに移植する簡単な方法はありますか?

4

2 に答える 2

2

訂正していただきたいのですが、私の知る限り、Winsock はソケットの領域を超えて拡張することはありません。つまり、select()、read()、write() などのシステム コールに対する Unix の「すべてがファイルである」という哲学は、Winsock にはありません。

ソケットとコンソール ハンドルで動作する Win32 API だけで同様のことができると確信していますが、もはや Winsock (または BSD) のようには見えません。

于 2008-12-28T15:08:53.820 に答える
1

Winsockのselect()はソケットでのみ機能します。より「Windows-y」の代替手段は、両方のハンドルで非同期I / Oを使用してから、 WaitForMultipleObjectsを使用することです。

于 2008-12-29T02:20:59.967 に答える