27

我只是尝试使用 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 存储库

4

6 回答 6

27

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

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

于 2011-07-23T15:36:21.870 回答
9

WinSock 和 WinSock2 具有与 BSD 套接字不同的函数名称。如果我想编写跨平台应用程序,那么我编写了很多变通方法来让 Microsoft 满意。

如果 MinGW 中包含特殊的“socket.h”和“socket.c”文件,通过调用相应的 WinSock2 对应部分来简单地翻译内容,那就容易多了。

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

于 2010-06-26T15:45:25.250 回答
5

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

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

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

编辑:我最终也不得不closeshutdown/closesocketwrite. send代码编译得很好,但如果没有这些额外的更改,它实际上并不能工作。

于 2012-03-29T20:23:08.297 回答
3

请参阅 stackoverflow 链接:从哪里获得“sys/socket.h”标头/源文件?

答案/解决方案更明确。

于 2014-07-11T10:28:03.820 回答
3

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

于 2009-10-05T01:18:52.470 回答
3

MingWin 是极简主义的,这是它最重要的方面。因为它更容易理解,所以最终编写应用程序是开发人员的责任。MingWin 只是让事情变得更容易,但在将 nix 应用程序转换为 Windows 方面并没有什么魔力。

于 2009-12-23T20:57:52.640 回答