winsock不支持读/写

时间:2011-01-24 02:19:35

标签: c winsock

使用一个小的测试程序(在Linux上使用mingw编译),我注意到无法使用Winsock2的{{1}实现获得的套接字fd上的readwrite调用打电话。写调用返回< 0并设置errno = EBADF。

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

那么,除了对fd进行假设之外,对文件描述符类型 - 只读/写stdin / stdout的程序如何在win32环境中合理地工作?

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

3 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:5)

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

答案 2 :(得分:0)

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

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