Winsock не поддерживает чтение/запись

С небольшой тестовой программой (скомпилированной с mingw в Linux) я заметил, что нельзя использовать вызовы read и write на сокете fd, полученные с использованием реализации вызова socket Winsock2. Вызов записи возвращает < 0 и устанавливает errno = EBADF.

Подумайте о программах, запущенных из xinetd, за вычетом их предположения, что их stdin/stdout всегда является сокетом. (Некоторые программы действительно вызывают getpeername, например, что не удастся, если оно не является сокетом, а затем они могут выйти преждевременно.)

Итак, как {{описатель типа}} -значительные программы, которые только что читают/записывают из/в stdin/stdout, которые должны разумно работать в среде win32, если не делать предположений о fd?

Или, проще говоря, есть какой-нибудь вызов магической функции, который должен быть выполнен для подключения к Winsock2 socket fds с реализацией win32 (ну, mingw) write?

Ответ 1

Если вы хотите какого-либо нормального поведения в Windows, забудьте о mingw. Он использует стандартную библиотеку MSVС++, которая даже не может соответствовать стандартному стандарту C, а тем более POSIX. К сожалению, cygwin немного раздувается, но я бы просто принял надувание как цену программирования для Windows и пошел с cygwin. Или вы можете написать две разные версии каждой программы, которую вы пишете, возможно запутавшись с #ifdef s, для поддержки как MSVC, так и POSIX...

Ответ 2

Функции read() и write() представляют собой системные вызовы POSIX I/O, а не вызовы API сокетов.

MinGW предназначен для компиляции на родную платформу Windows. Он не обеспечивает среду POSIX.

При использовании MinGW с Winsock у вас есть два варианта:

  • Используйте вызовы API сокетов send() и recv().
  • Используйте системные вызовы Windows I/O WriteFile() и ReadFile().

Ответ 3

Ручки Socket для Windows не являются файловыми дескрипторами. Вы должны использовать функции Winsock для чтения/записи/изменения состояния.

Также вы не можете использовать select или его ilk последовательно с другими типами дескрипторов в Windows.