MinGW中的套接字

Use*_*er1 24 c++ sockets mingw msys

我只是尝试使用MinGW在MSYS中构建netcat,并意识到MinGW从未真正将所有BSD套接字移植到Windows(例如sys/socket.h).我知道你可以在MinGW中使用Windows套接字,但为什么他们从不制作BSD套接字的Windows端口?我注意到有很多程序使用#ifdef来解决这个问题.是否有某个可以使用的BSD套接字的Windows端口?

以下是在MSYS中为netcat执行make时的错误:


gcc -DLOCALEDIR=\"\/usr/local/share/locale\" -DHAVE_CONFIG_H -I. -I. -I.. -g -O2 -Wall -c `test -f 'core.c' || echo './'`core.c
In file included from core.c:29:
netcat.h:38:24: sys/socket.h: No such file or directory
netcat.h:39:63: sys/uio.h: No such file or directory
netcat.h:41:24: netinet/in.h: No such file or directory
netcat.h:42:55: arpa/inet.h: No such file or directory

MinGW没有#ifdef.是否有一个库/包我可以添加到MSYS,使一切编译没有错误?

注意:您可以下载的netcat 这里,浏览CVS回购这里

kal*_*lev 25

BSD sys/socket.h是一个POSIX标头,win32 API不支持它.MinGW标头只是本机win32标头的重新实现,不提供额外的POSIX兼容性.

如果您正在寻找sys/socket.h支持,请尝试使用GNU gnulib的sys/socket.h替换,或者使用Cygwin,它在Windows上提供POSIX兼容包装.

  • 我刚刚注意到这个问题已经快2年了.不过,也许答案对未来的某些人有用. (4认同)

小智 7

WinSock和WinSock2具有来自BSD套接字的不同功能名称.如果我想编写跨平台应用程序,那么我需要编写很多解决方法来保持微软的快乐.

如果MinGW中包含特殊的"socket.h"和"socket.c"文件,通过调用相应的WinSock2计数器部件来简单地翻译内容,那将会容易得多.

我刚刚开始学习C编程,所以我自己无法做到这一点,但我很惊讶到目前为止似乎没有人尝试过.


dav*_*pcj 5

来自另一个答案的这些评论作为我需要的答案,以获取一段简单的 bsd 套接字代码以在 Windows 上使用 mingw 进行编译。

用 #include 替换所有这些包含,因为这将是 winsock 的等效标头,然后看看会发生什么。

您还需要链接 ws2_32 并使用 WSAStartup/WSACleanup。这可能会让你启动并运行。

编辑:我也结束了不必更换closeshutdown/closesocketwrite使用send。代码编译得很好,但如果没有这些额外的更改,它实际上无法正常工作。


And*_*ith 3

正如 ChrisW 所说,Winsock2 是 BSD 套接字的一个端口。您尝试使用的winsock 的哪一部分与BSD 套接字不同?(WSAStartup 和 WSACleanup 除外)

  • 如果这样做,您还需要链接到 ws2_32 并使用 WSAStartup/WSACleanup。这*可能*会让您启动并运行。 (3认同)
  • 我只是想让 netcat 编译。我将用当前错误更新问题。 (2认同)