2011-01-24 57 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()