Winsock не поддерживает чтение / запись - PullRequest
3 голосов
/ 24 января 2011

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 26 сентября 2012

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

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

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

  1. Используйте вызовы API сокетов send() и recv().
  2. Использование системных вызовов Windows I / O WriteFile() и ReadFile().
5 голосов
/ 24 января 2011

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

0 голосов
/ 24 января 2011

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

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

...