Подтвердить что ты не робот

Розетки в MinGW

Я просто пытался создать 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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 6

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

Ответ 7

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

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

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

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

И ссылку вроде этого:

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