winsock不支持读/写

使用一个小的测试程序(在Linux上使用mingw编译),我注意到不能使用Winsock2的socket调用实现获得的socket fd上的write调用。 写调用返回<0并设置errno = EBADF。

想想从xinetd运行的程序,减去他们的stdin / stdout始终是套接字的假设。 (例如,某些程序会调用getpeername,如果它不是套接字,则会失败,随后它们可能会过早退出。)

那么,除了对fd进行假设之外,如何在/ windin / stdout中读取/写入的{文件描述符类型} – 不可知程序应该合理地在win32环境中工作?

或者更简单地说,是否有一些魔术函数调用要用win32(well,mingw) write实现来连接Winsock2套接字fds?

如果你想在Windows上有任何理智的行为,请忘记mingw。 它使用MSVC ++标准库,它甚至无法符合普通的C标准,更不用说POSIX了。 可悲的是,cygwin有点臃肿,但我只是接受膨胀作为Windows编程的代价并与cygwin一起使用。 或者你可以编写你编写的每个程序的2个不同版本,可能与#ifdef s纠缠在一起,以支持MSVC和POSIX ……

read()write()函数是POSIX I / O系统调用,而不是套接字API调用。

MinGW用于编译本机Windows平台。 它不提供POSIX环境。

将MinGW与Winsock一起使用时,您有两种选择:

  1. 使用套接字API调用send()recv()
  2. 使用Windows I / O系统调用WriteFile()ReadFile()

Windows上的套接字句柄不是文件句柄。 您必须使用Winsock函数来读/写/更改状态。

你也不能在Windows中使用select或者其他类型的句柄。