将Winsock移植到Linux套接字

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

我的问题是:我可以轻松地将它转移到Linux实现吗?

是否有任何我应该知道的陷阱,如果我只是简单地包含适当的头文件,我将不得不处理什么样的事情?

谢谢你的帮助!

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

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

这将取决于你是否使用任何Windows特定的网络功能,或者如果你只是使用主要是BSD兼容的API。

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

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

根据这个函数列表,事情应该或多或少的起作用。 在调用WSAStartupWSACleanup添加#if _WIN32 (相当于linux没有做任何事情,套接字库自动初始化)。

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

唯一使移植困难的呼叫是WSA *呼叫。

WSAStartup() – > nop WSACleanup() – > nop

Socket / setsockopt – > socket / setsockopt

在* nix下,套接字在默认情况下被阻塞,并且不需要或不可能使用怪异的setsockopt调用来摆弄它。

ioctlsocket – > ioctl

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

—-其余的答案似乎只适用于Win95兼容的winsock —-

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

没有看到代码,很难说它是多么容易。 但是你应该能够将winsock调用替换为sys / sockets.h中的模拟。