使用一个小的测试程序(在Linux上使用mingw编译),我注意到无法使用Winsock2的{{1}实现获得的套接字fd上的read
和write
调用打电话。写调用返回< 0并设置errno = EBADF。
考虑从xinetd运行的程序,减去他们的stdin / stdout始终是套接字的假设。 (例如,某些程序会调用getpeername,如果它不是套接字,则会失败,随后它们可能会过早退出。)
那么,除了对fd进行假设之外,对文件描述符类型 - 只读/写stdin / stdout的程序如何在win32环境中合理地工作?
或者更简单地说,是否有一些魔术函数调用要用win32(well,mingw)socket
实现连接Winsock2套接字fds?
答案 0 :(得分:6)
read()
和write()
函数是POSIX I / O系统调用,而不是套接字API调用。
MinGW用于编译本机Windows平台。它不提供POSIX环境。
将MinGW与Winsock一起使用时,您有两种选择:
send()
和recv()
。WriteFile()
和ReadFile()
。答案 1 :(得分:5)
如果你想在Windows上有任何理智的行为,请忘记mingw。它使用MSVC ++标准库,它甚至无法符合 plain C 标准,更不用说POSIX了。可悲的是,cygwin有点臃肿,但我会接受这个膨胀作为Windows编程的代价并与cygwin一起使用。或者你可以写下你编写的每个程序的2个不同版本,可能与#ifdef
s纠缠在一起,以支持MSVC和POSIX ......
答案 2 :(得分:0)
Windows上的套接字句柄不是文件句柄。您必须使用Winsock函数来读/写/更改状态。
您也不能在Windows中使用select
或其他类型的句柄。