Розетки в MinGW - PullRequest
       49

Розетки в MinGW

23 голосов
/ 05 октября 2009

Я просто пытался собрать netcat в MSYS, используя MinGW, и понял, что MinGW никогда не переносил весь материал сокетов BSD в Windows (например, sys / socket.h). Я знаю, что вы можете использовать Windows Sockets в MinGW, но почему они никогда не делали Windows-порт BSD-сокетов? Я заметил довольно много программ, использующих # ifdef для обхода проблемы. Есть ли где-нибудь Windows-порт BSD-сокетов, который можно использовать вместо этого?

Вот ошибки при создании make для netcat в 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

Для MinGW нет # ifdef. Есть ли библиотека / пакет, который я могу добавить в MSYS, чтобы все компилировалось без ошибок?

Примечание. Вы можете скачать netcat здесь и просмотреть репозиторий CVS здесь

Ответы [ 7 ]

24 голосов
/ 23 июля 2011

BSD sys / socket.h - это заголовок POSIX, и win32 API его не поддерживает. Заголовки MinGW - это просто повторная реализация родных заголовков win32, которые не обеспечивают дополнительную совместимость с POSIX.

Если вам нужна поддержка sys / socket.h, попробуйте GNU gnulib sys / socket.h для замены или используйте Cygwin , который предоставляет оболочку совместимости с POSIX в Windows .

6 голосов
/ 26 июня 2010

WinSock и WinSock2 имеют разные имена функций из сокетов BSD. Если я хочу писать кроссплатформенные приложения, то у меня есть много обходных путей, чтобы Microsoft была довольна.

Было бы намного проще, если бы в MinGW были включены специальные файлы "socket.h" и "socket.c", которые просто переводили вещи, вызывая соответствующие компоненты WinSock2.

Я только начинаю изучать программирование на С, поэтому я не могу сделать это сам, но я удивлен, что никто, похоже, даже не пытался это сделать до сих пор.

4 голосов
/ 30 марта 2012

Эти комментарии из другого ответа послужили тем ответом, который мне был нужен, чтобы получить кусок простого кода сокета bsd для компиляции с помощью mingw на windows.

Замените все эти включения на #include, так как это быть эквивалентным заголовком для winsock, затем посмотрим, что произойдет.

Вам также понадобится установить ссылку на ws2_32 и использовать WSAStartup / WSACleanup. Что может заставить вас работать.

EDIT: Мне также пришлось заменить close на shutdown / closesocket и write на send. Код скомпилирован нормально, но на самом деле не работает без этих дополнительных изменений.

3 голосов
/ 11 июля 2014

См. Ссылку на stackoverflow: Где взять заголовочный файл / файл sys / socket.h?

Ответ / решение более явное.

3 голосов
/ 23 декабря 2009

MingWin - это минимализм, и это самый важный аспект. Поскольку это облегчает понимание, в конечном итоге ответственность за написание приложения лежит на разработчике. MingWin только упрощает работу, но не творит волшебство в том, чтобы привязывать приложения nix к окнам.

2 голосов
/ 18 июня 2013

Есть ли библиотека / пакет, который я могу добавить в MSYS, чтобы все компилировалось без ошибок?

MSYS - это форк Cygwin. Он предоставляет API сокетов BSD, как и Cygwin. Если у вас есть MSYS, вы можете просто скомпилировать код следующим образом:

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

-I/include необходим, чтобы заставить компилятор искать в каталоге MSYS include.

И ссылка такая:

gcc -o test.exe test.o /bin/msys-1.0.dll
2 голосов
/ 05 октября 2009

Как сказал ChrisW, Winsock2 - это порт BSD-сокетов. Какую часть winsock вы пытаетесь использовать, которая отличается от сокетов BSD? (кроме WSAStartup и WSACleanup)

...