我一直在尝试用C ++ Unix风格编写服务器,但我被困在Windows机器上。我从MinGW开始,但它没有正确编译并告诉我它找不到“sys / socket.h”文件。当然,这对于服务器甚至工作是必要的。我去寻找它,我觉得某个地方说安装Cygwin,因为它有很多库。好的,我安装了它。它可能为我提供的每一个图书馆。然后我再次编译,它仍然无法找到它。我去搜索整个包含文件夹,但找不到该文件。所以我有点恼火(3小时下来,我不需要额外的功能),但我继续搜索。我无论如何都找不到它。我找到了多个使用它的参考,但我无法找到任何下载它。我现在一直在寻找过去的几个小时,而且我对所有事情都感到非常沮丧,因为没有参考我可以得到它的地方(我不会使用winsock。如果我没记错的话,会打破兼容性。)< / p>
所以,长话短说,我在哪里可以下载'socket.h'/'socket.c'/'socket.cpp'文件?它会让我的生活(我相信很多人的生活)变得更容易,我真的很感激它!
答案 0 :(得分:35)
鉴于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子系统未针对您的进程进行初始化。
答案 1 :(得分:10)
由于您已经标记了问题C ++,您可能有兴趣使用boost::asio,ACE或其他一些用于C ++或C的跨平台套接字库。其他一些跨平台库可以在C++ sockets library for cross-platform和Cross platform Networking 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,download a copy of Ubuntu的副本,将Ubuntu安装到VirtualBox中,然后在Ubuntu上进行编码和测试。或者,我被告知微软销售“UNIX子系统”,并且它预先安装在Windows的某些高端版本上,虽然我不知道这个系统是否合规(如果它符合要求,哪个版本它符合的UNIX标准)。 Winsockets也是一种选择,虽然它们的行为方式可能与它们的POSIX对应物略有不同,即使签名可能类似。
答案 2 :(得分:1)
我想补充一点,如果你想使用Windows套接字库,你必须:
开头:调用WSAStartup()
结尾:调用WSACleanup()
问候;
答案 3 :(得分:1)
尝试使用选定的软件包重新安装cygwin:gcc -g ++:gnu编译器集合c ++(来自devel类别),openssh服务器和客户端程序(net),make:gnu版本(devel),ncurses终端(utils),增强vim编辑器(编辑器),ANSI通用lisp实现(数学)和libncurses-devel(lib)。
此库文件应位于cygwin \ usr \ include
下问候。