Смешивание файловых дескрипторов и сокетов в Winsock - PullRequest
5 голосов
/ 28 декабря 2008

Я портирую некоторый код из сокетов BSD в Winsock, и я не уверен, как справиться с приведенным ниже случаем.

Мое оригинальное приложение выполняет выбор как на стандартном, так и на сетевом сокетах:

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

Попытка запустить это в Winsock выдает ошибку 10038 (WSAENOTSOCK), что имеет смысл, поскольку дескриптор файла 0 в Linux (stdin) не является сокетом (точнее: типом SOCKET) в Windows.

Есть ли простой способ перенести этот тест на сокеты Windows?

Ответы [ 2 ]

2 голосов
/ 28 декабря 2008

Я бы с радостью поправился, но, насколько я знаю, Winsock не выходит за рамки сокетов. То есть философия Unix «все является файлом» для системных вызовов select (), read (), write () и т. Д. В Winsock отсутствует.

Я уверен, что вы можете сделать что-то похожее только с Win32 API, работающим с дескрипторами сокетов и консолей, но он больше не будет похож на Winsock (или BSD).

1 голос
/ 29 декабря 2008

Winsock's select () работает только с сокетами. Более альтернативой Windows-y было бы использование асинхронного ввода-вывода на обоих дескрипторах, а затем WaitForMultipleObjects .

...