在哪里获得"sys/socket.h"头/源文件?

Ano*_*ohn 26 c++ unix sockets

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

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

Jer*_*ner 40

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

#ifdef __WIN32__
# include <winsock2.h>
#else
# include <sys/socket.h>
#endif
Run Code Online (Sandbox Code Playgroud)

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

#ifdef __WIN32__
   WORD versionWanted = MAKEWORD(1, 1);
   WSADATA wsaData;
   WSAStartup(versionWanted, &wsaData);
#endif
Run Code Online (Sandbox Code Playgroud)

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


Mic*_*yan 12

既然您已经标记了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标准).Winsockets也是一种选择,尽管它们的行为方式可能与它们的POSIX对应物略有不同,即使签名可能类似.

  • 您所指的子系统称为[Interix](http://en.wikipedia.org/wiki/Interix)+1 (2认同)
  • @BillyONeal,维基页面表明,*微软于 2011 年宣布 Interix 将不会包含在 Windows 8 之后的 Windows 版本中,客户应该开始将其应用程序迁移到替代解决方案。* (2认同)