C++ MinGW 中的套接字

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1517762/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-27 20:15:08  来源:igfitidea点击:

Sockets in MinGW

c++mingwsocketsmsys

提问by User1

I was just trying to build netcat in MSYS using MinGW and realized that MinGW never really ported all of the BSD socket stuff to Windows (eg sys/socket.h). I know you can use Windows Sockets in MinGW, but why did they never make a Windows port of the BSD sockets? I noticed quite a few programs using #ifdef's to workaround the issue. Is there a Windows port of the BSD sockets somewhere that can be used instead?

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

Here are the errors when doing a make for netcat in MSYS:

以下是在 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

There are no #ifdef's for MinGW. Is there a library/package I can add to MSYS to make everything compile without errors?

MinGW 没有#ifdef。是否有一个库/包我可以添加到 MSYS 以使所有内容都无错误地编译?

Note: You can download netcat hereand browse the CVS repo here

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

回答by kalev

BSD sys/socket.his a POSIX header and the win32 API doesn't support it. MinGW headers are just a reimplementation of native win32 headers and don't offer additional POSIX compatibility.

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

If you are looking for sys/socket.h support, try either GNU gnulib's sys/socket.h replacementor go with Cygwin, which provides a POSIX compatibility wrapper on Windows.

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

回答by Randolf Richardson

WinSock and WinSock2 have different function names from the BSD Sockets. If I wish to write cross-platform applications, then I have code a lot of work-arounds just to keep Microsoft happy.

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

It would be so much easier if there were special "socket.h" and "socket.c" files included with MinGW that simply translated stuff by calling the respective WinSock2 counter-parts.

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

I'm just starting to learn C programming, so I'm unable to do this myself, but I'm surprised that nobody seems to have even attempted this so far.

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

回答by davenpcj

These comments from another answer served as the answer I needed to get a piece of simple bsd socket code to compile with mingw on windows.

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

Replace all of those includes with #include as that would be the equivalent header for winsock, then see what happens.

You will also need to link against ws2_32 and use WSAStartup/WSACleanup. Which might get you up and running.

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

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

EDIT: I also ended up having to replace closewith shutdown/ closesocketand writewith send. The code compiled fine but didn't actually work without those additional changes.

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

回答by jlguenego

See the stackoverflow link : Where does one get the "sys/socket.h" header/source file?

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

The answer/solution is more explicit.

答案/解决方案更明确。

回答by user237890

MingWin is minimalist, and that is the most important aspect of it. Because it makes it easier to understand, at the end it is the developer's responsibility to write the application. MingWin only makes things easier but does no magic in turing nix apps to windows.

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

回答by Andrew Keith

As ChrisW said, Winsock2 is a port of BSD sockets. Which part of winsock are you trying to use which differs from BSD sockets ? (other than the WSAStartup and WSACleanup)

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

回答by Oktalist

Is there a library/package I can add to MSYS to make everything compile without errors?

是否有一个库/包我可以添加到 MSYS 以使所有内容都无错误地编译?

MSYS is a fork of Cygwin. It provides a BSD sockets API just like Cygwin. If you have MSYS, you should just be able to compile your code like this:

MSYS 是 Cygwin 的一个分支。它提供了一个 BSD 套接字 API,就像 Cygwin 一样。如果你有 MSYS,你应该能够像这样编译你的代码:

gcc -c -o test.o test.c -I/include

The -I/includeis needed to force the compiler to look in the MSYS include directory.

-I/include是需要强制编译器看在MSYS包括目录。

And link like this:

和这样的链接:

gcc -o test.exe test.o /bin/msys-1.0.dll