将Winsock移植到Linux套接字

14
我有一个使用Winsock进行网络编程的程序,我们现在要求将该程序移植到Linux上。唯一阻碍我们进行此操作的是Winsock。
我的问题是:将其移植到Linux实现有多容易?
是否有任何需要注意的陷阱?如果我简单地包含适当的头文件,我需要确保处理哪些事情?
谢谢任何帮助!
很遗憾由于法律原因,我不能发布代码。但是,我们的代码使用以下内容:
WSAStartup(..)
WSACleanup(..)
Socket(..)
sendto(..)
recvfrom(..)
ioctlsocket(..)
setsocketopt(..)
4个回答

11
基于这个函数列表,事情应该基本可以运行。在调用WSAStartupWSACleanup时添加#if _WIN32(Linux的等效方式是不执行任何操作,套接字库会自动初始化)。
在设置套接字选项时,您可能需要一些特定于操作系统的代码,其中一些选项是相同的,一些选项不同,并且类型可能不同。

10

这将取决于您是否使用任何特定于Windows的网络功能,或者是否仅使用大多数兼容BSD的API。

因此,如果您使用重叠I/O和I/O完成端口以及Winsock API的其他高级部分,则很难进行移植,而如果您仅使用兼容BSD的内容,则应该很容易编写一个薄翻译层,甚至只需在Windows特定的ifdef中启动和关闭winsock即可...

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


4
唯一使移植困难的是WSA *调用。
WSAStartup() -> 无操作 WSACleanup() -> 无操作
套接字/ setsockopt -> 套接字/setsockopt
在*nix下,默认情况下,套接字是阻塞的,不需要也不能使用那个奇怪的setsockopt调用来处理它。
ioctlsocket -> ioctl
在*nix下,我们不太喜欢异步套接字,并且更喜欢使用select()系统调用。
----此答案的其余部分似乎仅适用于Win95兼容的winsock----
不幸的是,由于Winsock中的原始socket()在某些情况下存在问题,您可能使用了WSASocket(),因此必须转换这些调用。

我们的代码使用了socket(),我已经发布了在代码中使用的函数,因为我无法发布实际的代码。 - Mike Bailey
1
不可能操纵阻塞吗?可以通过使用fcntl(2)在套接字文件描述符上设置O_NONBLOCK标志来对套接字进行非阻塞I / O。您是正确的,它是一个不同的函数,而不是“setsockopt”。 - Ben Voigt
Ben Voigt:没错。Windows的setsockopt调用是在NULL句柄上调用的,并为所有新套接字设置模式。 - Joshua
1
我从未在空句柄上调用过 setsockopt。这种行为在哪里有记录? - Ben Voigt
很有趣,我再也找不到在线文档了。也许是因为我在初始化中使用了Win9x兼容版本号的winsock,所以它才会有这种有趣的行为。 - Joshua
阅读 MSDN Winsock 参考文献(http://msdn.microsoft.com/en-us/library/windows/desktop/ms740632%28v=vs.85%29.aspx)并不让我相信 Windows 和 Linux 对阻塞套接字有任何不同的处理方式。 - pattivacek

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接