Где взять заголовочный файл / файл sys / socket.h? - PullRequest
24 голосов
/ 09 января 2011

Я пытался написать сервер в стиле C ++ Unix, но я застрял на машине с Windows.Я начал с MinGW, но он не скомпилировался правильно и сказал, что не может найти файл "sys / socket.h".Что, конечно, необходимо, чтобы сервер даже работал.Я отправился на поиски и думаю, что где-то сказал установить Cygwin вместо этого, так как он поставляется с большим количеством библиотек.Итак, я установил его.Каждая библиотека, которую он мог бы предложить мне.Потом я снова пошел на компиляцию, и он все еще не может ее найти.Я отправился на поиски по всей папке включений и не смог найти файл.Так что я был немного взбешен (3 часа бездействия для дополнительной функциональности, которая мне не нужна), но я продолжил поиск.Я не могу найти это в любом месте.Я нахожу несколько ссылок на его использование, но я не могу найти где-нибудь, чтобы загрузить его.Я искал последние несколько часов сейчас, и я стал очень разочарован всем, потому что нет никаких ссылок на то, где я могу его получить (и я НЕ буду использовать winsock. Это нарушает совместимость, если я правильно помню).1001 *

Итак, короче говоря, где я могу скачать файлы 'socket.h' / 'socket.c' / 'socket.cpp'?Это сделало бы мою жизнь (и я уверен, что жизнь многих других) НАСТОЛЬКО проще, и я был бы очень признателен!

Ответы [ 4 ]

37 голосов
/ 10 января 2011

Учитывая, что в Windows нет sys / socket.h, вы можете подумать о том, чтобы сделать что-то вроде этого:

#ifdef __WIN32__
# include <winsock2.h>
#else
# include <sys/socket.h>
#endif

Я знаю, что вы указали, что не будете использовать WinSock, но поскольку WinSock - это то, как TCPработа в сети осуществляется под Windows, я не вижу никакой альтернативы.Даже если вы используете кроссплатформенную сетевую библиотеку, эта библиотека будет вызывать WinSock изнутри.Большинство стандартных вызовов API BSD-сокетов реализованы в WinSock, поэтому, немного потрудившись, вы можете заставить одну и ту же программу на основе сокетов компилироваться как в Windows, так и в других ОС.Только не забудьте сделать

#ifdef __WIN32__
   WORD versionWanted = MAKEWORD(1, 1);
   WSADATA wsaData;
   WSAStartup(versionWanted, &wsaData);
#endif

в верхней части main () ... в противном случае все ваши вызовы сокетов завершатся неудачно в Windows, потому что подсистема WSA не была инициализирована для вашего процесса.

11 голосов
/ 10 января 2011

Поскольку вы пометили вопрос C ++, вас может заинтересовать использование boost :: asio , ACE или какой-либо другой кроссплатформенной библиотеки сокетов для C ++ или для CНекоторые другие кроссплатформенные библиотеки могут быть найдены в ответах на Библиотека сокетов C ++ для кроссплатформенного и API кроссплатформенной сети .

Предполагается, что использование третьегоБиблиотека кроссплатформенных сокетов для вечеринок вам не подходит ...

Заголовок определено в IEEE Std.1003.1 (POSIX), но, к сожалению, Windows не соответствует стандарту POSIX.Компилятор MinGW является портом GCC для компиляции приложений Windows и поэтому не включает эти системные заголовки POSIX.Если вы устанавливаете GCC, используя Cygwin , то он будет включать эти системные заголовки для эмуляции среды POSIX в Windows.Имейте в виду, однако, что если вы используете Cygwin для сокетов, которые а.) Вам нужно будет поместить библиотеку cygwin в место, где ваше приложение может ее прочитать, и б.) Заголовки Cygwin и заголовки Windows не очень хорошо взаимодействуют (поэтомуесли вы планируете включить windows.h, то, вероятно, вы не хотите включать sys/socket.h).

Моя личная рекомендация - загрузить копию VirtualBox , загрузите копию Ubuntu , установите Ubuntu в VirtualBox, а затем выполните кодирование и тестирование в Ubuntu.В качестве альтернативы мне говорят, что Microsoft продает «подсистему UNIX» и что она предустановлена ​​в некоторых более поздних выпусках Windows, хотя я понятия не имею, насколько эта система совместима (и, если она совместима, с каким выпуском)стандарта UNIX это соответствует).Winsockets также вариант, хотя они могут вести себя немного иначе, чем их аналоги POSIX, даже если подписи могут быть похожими.

1 голос
/ 06 ноября 2017

Попробуйте переустановить cygwin с выбранным пакетом: gcc-g ++: коллекция компиляторов gnu c ++ (из категории devel), сервер openssh и клиентская программа (net), make: версия gnu (devel), терминал ncurses (utils), улучшенныйvim editors (редакторы), общая реализация ANSI для lisp (математика) и libncurses-devel (lib).

Эти библиотечные файлы должны находиться в папке cygwin \ usr \ include

Regards.

1 голос
/ 03 ноября 2017

Я хотел бы просто добавить, что если вы хотите использовать библиотеку сокетов Windows, вы должны:

  • в начале: вызвать WSAStartup ()

  • в конце: вызов WSACleanup ()

С уважением;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...