Розетки в 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 здесь
Ответы
Ответ 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-приложений для окон.
Ответ 5
См. ссылку stackoverflow: Где можно получить файл sys/socket.h " заголовок/исходный файл?
Ответ/решение более явственно.
Ответ 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