2011-01-24 41 views
3

通过一个小的测试程序(在Linux上用mingw编译),我注意到不能使用调用的Winsock2的socket实现获得的套接字fd上的readwrite调用。写入调用返回< 0并设置errno = EBADF。winsock不支持读/写

想象一下从xinetd运行的程序,减去他们的stdin/stdout始终是套接字的假设。 (有些程序确实调用了getpeername,例如,如果它不是套接字,将会失败,随后它们可能会提前退出。)

那么如何{文件描述符类型} - 只读取/写入标准输入/ stdout应该合理地在win32环境中工作,除非对fd做出假设?

或者更简单的说,是否有一些神奇的函数调用来执行Winsock2 socket fds与win32(well,mingw)write的实现?

回答

5

如果你想在Windows上找到任何一种理智的行为,忘记明治。它使用MSVC++标准库,甚至不能符合标准,更不用说POSIX。令人遗憾的是,cygwin有点臃肿,但我只是接受膨胀作为Windows编程的价格,并使用cygwin。或者您可以编写您编写的每个程序的2个不同版本,可能与#ifdef s纠结,以同时支持MSVC和POSIX ...

+0

啊cygwin,很好的电话,感谢提醒我它的存在。我想知道是否可以直接交叉编译,也就是说,不需要使用wine来运行cygwin gcc。 – user562374 2011-01-24 02:40:43

0

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

您也不能在Windows中使用select或与其他类型的句柄保持一致。

5

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

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

使用的MinGW的Winsock,你有两个选择:

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