Sockets in MinGW
Asked Answered
R

6

30

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?

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


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?

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

Redpoll answered 5/10, 2009 at 0:21 Comment(3)
Winsock itself was originally a port of the Berkeley sockets API.Offense
@ChrisW, I've never understood what's the point of making Winsock different from UNIX?Hyrup
@Hyrup I think that Winsock is simpler in that it has fewer header files to include. See e.g. Transitioning from UNIX to Windows Socket Programming for further details.Offense
W
27

BSD sys/socket.h is 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.

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

Williamson answered 23/7, 2011 at 15:36 Comment(3)
about gnulib for mingw : "some modules are currently unsupported on mingw: mgetgroups, getugroups, idcache, userspec, openpty, login_tty, forkpty, pt_chown, grantpt, pty, savewd, mkancesdirs, mkdir-p, euidaccess, faccessat.", "mingw in 64-bit mode is not tested and low priority so far" gnu.org/software/gnulib/manual/gnulib.html#Target-PlatformsMurmurous
@kalev, I never understood this. What's the point of gnulib when there's already cygwin?Hyrup
@Hyrup Cygwin is a Unix emulator for Windows whereas gnulib is a library which lets you port most of the traditional Unix packages to virtually any OS.Proportional
H
11

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.

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.

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.

Homeo answered 26/6, 2010 at 15:45 Comment(0)
A
5

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.

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.

EDIT: I also ended up having to replace close with shutdown / closesocket and write with send. The code compiled fine but didn't actually work without those additional changes.

Alfreda answered 29/3, 2012 at 20:23 Comment(0)
C
3

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)

Cathcart answered 5/10, 2009 at 1:18 Comment(3)
I'm just trying to get netcat to compile. I'll update the question with the current errors.Redpoll
Replace all of those includes with #include <winsock2.h> as that would be the equivalent header for winsock, then see what happens.Papandreou
if you do that, you will also need to link against ws2_32 and use WSAStartup/WSACleanup. Which might get you up and running.Rosalia
H
3

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.

Hydroelectric answered 23/12, 2009 at 20:57 Comment(1)
So we're supposed to write two copies of code for every single functionality? When does this make any sense?Hyrup
G
3

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

The answer/solution is more explicit.

Gradatim answered 11/7, 2014 at 10:28 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.