【问题标题】:Where does one get the "sys/socket.h" header/source file?从哪里获得“sys/socket.h”头文件/源文件?
【发布时间】:2011-01-09 10:01:10
【问题描述】:

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

那么,长话短说,我在哪里可以下载 'socket.h'/'socket.c'/'socket.cpp' 文件?它会让我的生活(我相信许多其他人的生活)变得更轻松,我将非常感激!

【问题讨论】:

  • Cygwin 拥有大部分 POSIX 头文件,包括 sys/socket.h。奇怪的是你没有找到它。我的 Cygwin 安装肯定有它。
  • @Sergey,他可能直接安装了MinGW,没有通过Cygwin安装。
  • 你需要吗? Windows 定义了一个几乎相同的 API,您可以使用它来代替。如果您需要跨平台可移植性,Boost.Asio 或 ACE 等库可能是更好的选择。
  • @Michael,他说“有人说要安装 Cygwin,因为它带有很多库。好的,所以我安装了它。”我无法想象如何在没有 sys/socket.h 的情况下安装 Cygwin。也许缺少一些开发包? Cygwin 对于为 Windows 编译原生 Unix 应用程序来说是一个非常好的东西,除非他们使用 fork(),这是有问题的,而且永远都是。
  • @jalf,说得好。或者也许是 Qt。它也有很好的套接字支持。无论如何,这些高级库比 Berkley 套接字 API 更易于使用。

标签: c++ sockets unix


【解决方案1】:

鉴于 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 子系统没有为您的进程初始化。

【讨论】:

  • 你不是也需要windows版本的关闭socket吗?还有其他几件事?
  • 是的,在windows下你需要调用closesocket()而不是close()。可能还有其他事情。
【解决方案2】:

由于您已将问题标记为 C++,您可能有兴趣使用 boost::asioACE 或其他用于 C++ 或 C 的跨平台套接字库。其他一些跨平台库可以在C++ sockets library for cross-platformCross platform Networking API 的答案。

假设您不适合使用第三方跨平台套接字库...

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

我个人的建议是下载VirtualBoxdownload a copy of Ubuntu 的副本,将 Ubuntu 安装到 VirtualBox,然后在 Ubuntu 上进行编码和测试。或者,有人告诉我,Microsoft 出售“UNIX 子系统”,并且它预装在某些高端版本的 Windows 上,尽管我不知道这个系统的兼容性如何(以及,如果它兼容,是哪个版本它符合 UNIX 标准)。 Winsockets 也是一种选择,尽管它们的行为方式可能与 POSIX 对应物略有不同,尽管签名可能相似。

【讨论】:

  • 你指的子系统叫Interix+1
  • @BillyONeal,该 wiki 页面表明,Microsoft 于 2011 年宣布,Windows 8 之后的 Windows 版本中将不再包含 Interix,客户应开始将其应用程序迁移到替代解决方案。我>
  • @iammilind 注意到该评论的日期了吗? :)
  • @BillyONEal,是的,我看到这个问题是 4 年前提出的。但是认为,看到我的评论,您可能会想出其他选择;)
【解决方案3】:

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

  • 开头:调用WSAStartup()

  • 最后:调用 WSACleanup()

问候;

【讨论】:

    【解决方案4】:

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

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

    问候。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      相关资源
      最近更新 更多