2011-01-06 58 views
5

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

我的问题是:我可以轻松地将此转换为Linux实现吗?

有没有我应该知道的陷阱,如果我只是包含适当的头文件,我必须确定要处理什么样的事情?

感谢您的帮助!

我会发布代码,但我不能不幸,由于法律原因。 但是,我们的代码并使用以下命令:

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

回答

6

这将取决于您是否使用任何Windows特定的网络功能,或者如果您只是使用大多数BSD兼容的API。因此,如果您使用重叠的I/O和I/O完成端口以及Winsock API的其他高级部分,那么事情将非常难以移植,如果您只是使用BSD兼容的东西,那么它应该很容易写一个薄转换层,甚至只是有一个特定的窗口内的ifdef在Winsock的启动和关闭的东西...

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

0

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

3

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

调用WSAStartup() - > NOP WSACleanup() - > NOP

插座/ setsockopt的 - >插座/ setsockopt的

在* nix中,插座是默认阻断,它不是必要的或者可以使用奇怪的setsockopt调用它来摆弄它。

ioctlsocket - > IOCTL

在* nix中,我们不太喜欢异步插座和喜欢使用select()系统调用。

----这个答案的休息似乎只适用于Win95的兼容的Winsock ----

不幸的是作为原始套接字()中的Winsock在某些情况下被打破,你可能使用WSASocket()和所以必须转换这些电话。

+0

我们的代码使用套接字(),我发布了哪些函数用于代码中,因为我无法发布实际的代码。 – 2011-01-06 17:25:01

8

基础的功能清单上,事情应该更或更少只是工作。在WSAStartupWSACleanup的调用周围添加#if _WIN32(相当于linux没有做任何事情,套接字库自动初始化)。

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