围绕winsock的BSD套接字兼容包装器?

Posted

技术标签:

【中文标题】围绕winsock的BSD套接字兼容包装器?【英文标题】:BSD socket compatible wrapper around winsock? 【发布时间】:2009-12-21 02:51:06 【问题描述】:

我正在尝试将 Linux 应用程序移植到 Windows。该应用程序并不太复杂,使用所有相当标准的代码,几乎没有外部依赖项。主要依赖项是 libelf(在 mingw 下编译良好)、pthreads(似乎有可用的 win32 版本)和套接字。主要问题在于套接字...Windows 提供了 WinSock,但这不是 100% 兼容所有 *nixes 使用的 BSD (Berkeley) 套接字。我想知道的是,是否有人在 windows 上编写了一个封装器,它公开了一个 BSD 套接字 API,但在后端调用 Winsock,以简化移植?

【问题讨论】:

【参考方案1】:

我建议使用 cygwin.dll 。它是为将 *nixes 引入窗口而构建的,包括套接字、文件 IO 等。

【讨论】:

如果可能的话,我想避免使用 cygwin,使用它有很多缺点。除了套接字,这个应用程序在 mingw32 中编译得很好,BSD 套接字与 winsock 非常相似,所以我的想法是它们之间的包装器转换不会太复杂,而且这可能是已经存在的东西 是的,cygwin 确实带有一些“包袱”。源代码确实实现了有问题的包装器。尽管您会惊讶于 Winsock2.h 与 BSD 的接近程度(大多数情况下)。从摆脱编译器错误的角度来看,包装器似乎没问题。但是考虑到端口的简单性,额外的层可能不值得。我大约十年前做了一个移植,据我回忆,它几乎没有时间,主要是 find/replaceAll 过程。 MS 有一个指南,你可能已经看过:msdn.microsoft.com/en-us/library/ms738562(VS.85).aspx【参考方案2】:

在大多数情况下,您只需要确保 WSAStartup() 和 WSACleanup() 在开始和结束时被调用,否则,基本的 BSD 套接字将翻译得很好。您可以创建一些静态全局变量来检查对套接字调用的每次调用,并相应地调用 WSAStartup() 和 WSACleanup()。至于 poll() ...好吧,它很容易转换为 select()。

【讨论】:

感谢您的提示,我想它们有些帮助。但我更希望有人已经为我编写了代码,这样我就不必实施所有这些小修复来让它工作。

以上是关于围绕winsock的BSD套接字兼容包装器?的主要内容,如果未能解决你的问题,请参考以下文章

MinGW 链接器错误:winsock

tcp 服务器的奇怪行为(使用 winsock)

我正在使用 MS Visual C++ Express 为 C++ 寻找一个简单的套接字接口

Winsock编程基础2(Winsock编程流程)

无法绑定winsock套接字

套接字程序 Python vs C++ (Winsock)