【问题标题】:Porting Winsock to Linux Sockets将 Winsock 移植到 Linux 套接字
【发布时间】:2011-06-04 18:52:26
【问题描述】:

我有一个使用 Winsock 进行网络连接的程序,我们现在的要求之一是将我们的程序移植到 Linux。唯一阻止我们这样做的是 Winsock。

我的问题是:我如何轻松地将其移植到 Linux 实现?

是否有任何我应该注意的陷阱,如果我只是包含适当的头文件,我必须确保处理哪些类型的事情?

感谢您的帮助!

我会发布代码,但遗憾的是由于法律原因我不能发布。 但是,我们的代码确实使用了以下内容:

WSAStartup(..)
WSACleanup(..)
Socket(..)
sendto(..)
recvfrom(..)
ioctlsocket(..)
setsocketopt(..)

【问题讨论】:

    标签: windows linux sockets winsock porting


    【解决方案1】:

    根据该功能列表,事情应该或多或少正常工作。在对WSAStartupWSACleanup 的调用周围添加#if _WIN32(linux 等效是什么都不做,sockets 库会自动初始化)。

    在设置套接字选项时,您可能还需要一些依赖于操作系统的代码,其中一些相同,一些不同,并且类型可能不同。

    【讨论】:

      【解决方案2】:

      这取决于您是否使用任何特定于 Windows 的网络功能,或者您是否只使用大部分与 BSD 兼容的 API。

      因此,如果您使用重叠的 I/O 和 I/O 完成端口以及 Winsock API 的其他高级部分,那么移植将非常困难,如果您只是使用 BSD 兼容的东西,那么它应该很容易编写一个薄的翻译层,甚至只是在特定于 Windows 的 ifdef 中拥有 winsock 启动和关闭的东西......

      这可能会有所帮助:http://tangentsoft.net/wskfaq/articles/bsd-compatibility.html

      【讨论】:

        【解决方案3】:

        使移植变得困难的唯一调用是 WSA* 调用。

        WSAStartup() -> nop WSACleanup() -> nop

        套接字/setsockopt -> 套接字/setsockopt

        在 *nix 下,默认情况下套接字是阻塞的,没有必要或不可能使用那个奇怪的 setsockopt 调用来摆弄它。

        ioctlsocket -> ioctl

        在 *nix 下,我们不太喜欢异步套接字,而是更喜欢使用 select() 系统调用。

        ----这个答案的其余部分似乎只适用于Win95兼容的winsock----

        不幸的是,由于 Winsock 中的原始 socket() 在某些情况下被破坏,您可能使用了 WSASocket(),因此必须转换这些调用。

        【讨论】:

        • 我们的代码使用了socket(),我贴出了代码中用到了哪些函数,因为无法贴出实际代码。
        • 无法解决阻塞问题? It is possible to do non-blocking I/O on sockets by setting the O_NONBLOCK flag on a socket file descriptor using fcntl(2).你是对的,虽然它是一个不同的功能,而不是setsockopt
        • 本·沃伊特:完全正确。在 NULL 句柄上调用 windows setsockopt 调用并为所有新套接字设置模式。
        • 我从来没有在 NULL 句柄上调用过setsockopt。这种行为记录在哪里?
        • 这很有趣,我再也找不到在线文档了。可能是因为我在初始化时仍然使用Win9x兼容版本号的winsock,所以它有有趣的行为。
        【解决方案4】:

        没有看到代码,很难说它是多么容易。但是您应该能够将 winsock 调用替换为 sys/socket.h 中的类似物。

        【讨论】:

          猜你喜欢
          • 2021-05-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-17
          • 2011-03-06
          • 1970-01-01
          相关资源
          最近更新 更多