从哪里得到“sys / socket.h”头文件/源文件?

我一直在试图用C ++ Unix风格写一个服务器,但是我被困在Windows机器上。 我开始使用MinGW,但它没有正确的编译,并告诉我,它找不到“sys / socket.h”文件。 当然,这对服务器甚至是必要的工作。 我去寻找它,而且我认为某处说要安装Cygwin,因为它有很多库。 好的,所以我安装了它。 每一个图书馆它可能提供给我。 然后我又去编译了,但仍然无法find它。 我去了整个包含文件夹search,并找不到该文件。 所以我有点恼火(3小时后我不需要额外的function),但我继续search。 我找不到任何地方。 我find多个引用来使用它,但我无法find任何地方下载它。 我一直在寻找过去几个小时的时间,而且我对所有事情都感到非常沮丧,因为没有提及我能在哪里得到它(而且我不会使用winsock,如果我没有记错的话,这会破坏兼容性)。

所以,长话短说,我可以在哪里下载'socket.h'/'socket.c'/'socket.cpp'文件? 这将使我的生活(我相信许多人的生活)更容易,我真的很感激!

鉴于Windows没有sys / socket.h,你可能会考虑只是做这样的事情:

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

我知道你表示你不会使用WinSock,但是由于WinSock是在Windows下如何完成TCP网络连接,我没有看到你有任何其他选择。 即使您使用跨平台的网络库,该库也会在内部调用WinSock。 大多数标准的BSD套接字API调用都是在WinSock中实现的,所以在一些Windows和其他操作系统下都可以编译相同的基于套接字的程序。 只是不要忘了做一个

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

在main()的顶部,否则所有套接字调用都将在Windows下失败,因为WSA子系统未针对您的进程进行初始化。

由于您已经标记了C ++的问题,因此您可能会对使用boost :: asio , ACE或其他跨平台套接字库(对于C ++或C)感兴趣。其他一些跨平台库可能会在C ++的答案中找到用于跨平台和跨平台网络API的 套接字库 。

假设使用第三方跨平台套接字库不是你的选择…

头文件<sys / socket.h>在IEEE标准中定义。 1003.1(POSIX),但不幸的是,Windows不符合POSIX标准。 MinGW编译器是用于编译Windows应用程序的GCC的一个端口,因此不包括这些POSIX系统标题。 如果你使用Cygwin来安装GCC,那么它将包含这些系统头文件来模拟Windows上的POSIX环境。 但是,请注意,如果您使用Cygwin插入a。),您将需要将cygwin DLL放在应用程序可以读取它的位置。b)Cygwin标题和Windows标题不会很好地交互如果你打算包括windows.h ,那么你可能不希望包含sys/socket.h )。

我个人的建议是下载一个VirtualBox的副本, 下载Ubuntu的副本,将Ubuntu安装到VirtualBox中,然后在Ubuntu上进行编码和测试。 另外,我被告知,微软销售一个“UNIX子系统”,它被预先安装在Windows的某些更高版本上,尽管我不知道这个系统是如何兼容的(如果兼容的话,哪个版本它符合UNIX标准)。 Winsocket也是一种选择,虽然它们的行为可能与POSIX的行为方式略有不同,即使签名可能相似。

我只想补充一点,如果你想使用Windows套接字库,你必须:

  • 在开始时:调用WSAStartup()

  • 最后:调用WSACleanup()

问候;

尝试用选定的软件包重新安装cygwin:gcc-g ++:gnu编译器集合c ++(来自devel分类),openssh服务器和客户端程序(net),make:gnu版本(devel),ncurses终端(utils),增强vim编辑器编辑器),ANSI通用lisp实现(数学)和libncurses-devel(lib)。

这个库文件应该在cygwin \ usr \ include下

问候。