【问题标题】:Using sys/socket.h functions on windows在 Windows 上使用 sys/socket.h 函数
【发布时间】:2011-02-26 12:29:06
【问题描述】:

我正在尝试在 Windows 中使用 socket.h 函数。本质上,我目前正在查看https://beej.us/guide/bgnet/html/multi/clientserver.html#datagram 的示例代码。我知道 socket.h 是一个 Unix 函数——无论如何我可以在编译这个示例代码时轻松地模拟那个环境吗?不同的 IDE / 编译器会改变什么吗?

否则,我想我需要使用虚拟化 Linux 环境,这可能是最好的,因为代码很可能在 UNIX 环境中运行。

谢谢。

【问题讨论】:

    标签: c windows sockets


    【解决方案1】:

    我认为您正在寻找 Winsock 库。

    【讨论】:

      【解决方案2】:

      你有两个选择:

      1. 使用Cygwin(Unix 仿真库)。
      2. 端口到Winsock(Windows 标准库)。

      Cygwin:让您编译您的 Unix 源代码,但大多数情况下都不会受到影响,但会将您与 Cygwin 仿真库联系起来。这有两个含义:一般性能——不仅是网络——可能不是最优的;并且目标环境必须(在运行时)安装 Cygwin DLL。

      Winsock:这需要您将 sys/socket.h(BSD 套接字库,TCP/IP 堆栈的 UNIX 标准)替换为 winsock2.h,并重写部分代码 - 不多,但有一些。

      一些有价值信息的相关问题:

      Differences between winsock and BSD socket implementations

      Some Issues About Cygwin[Linux in Windows] (socket,thread,other programming and shell issues)

      Examples for Winsock?

      【讨论】:

      • +1 用于 winsock 和示例。我一直在使用winsock。我只需要更改一小部分代码就可以将我的 Unix 程序移植到 Windows。这很容易。
      • 虽然反过来有更多的惊喜 :) 例如,Windows 上的select 会忽略第一个参数,所以很自然,winsock 程序员将maxfd 置零。皇家痛苦:)
      • 2021 更新 - 另一个选项是 MSYS2,它是 cygwin 的一个分支,并且有类似的考虑 - 二进制文件必须与 MSYS2 运行时 DLL 一起分发。
      【解决方案3】:

      使用 BSD 标准为您提供的功能,编写跨平台网络应用程序并不容易。当然它会起作用,但是您必须进行一些替换,例如用 ioctlsocket(在 Windows 上)替换 ioctl(如果需要)。更多区别here.

      我的建议是使用隐藏这些丑陋差异并提供统一通信方式的库。我个人使用ACE。您有大量示例向您展示如何创建服务器和客户端。从样本中复制,看看他们是如何做到的。他们的邮件列表也很有帮助(不要忘记使用 PRF - 请参阅问题报告表格的源代码树)。您可以借书了解更多信息。重要提示:通过使用 ace,您可以使用 ACE 包装函数,如 socket、setsockopt、ioctl 等,而不必担心它们不起作用。不幸的是,这增加了一个库依赖项,这并不总是一种选择。但是 ACE 具有更强大的功能,我相信您一旦发现它们就会喜欢这些功能。提示:Reactor、Proactor。

      【讨论】:

        猜你喜欢
        • 2021-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 2012-04-07
        • 2015-12-21
        • 2015-12-12
        相关资源
        最近更新 更多