Windows 将Winsock移植到Linux套接字

Windows 将Winsock移植到Linux套接字,windows,linux,sockets,winsock,porting,Windows,Linux,Sockets,Winsock,Porting,我有一个使用Winsock进行网络连接的程序,我们现在的要求之一是将程序移植到Linux。唯一阻止我们这么做的是Winsock 我的问题是:把它移植到Linux实现中有多容易 是否有任何陷阱我应该知道,如果我只是包括适当的头文件,什么样的事情我必须确保处理 谢谢你的帮助 我想发布代码,但由于法律原因,我不能发布。 但是,我们的代码确实使用了以下内容: WSAStartup(..) WSACleanup(..) Socket(..) sendto(..) recvfrom(..) ioctlsoc

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

我的问题是:把它移植到Linux实现中有多容易

是否有任何陷阱我应该知道,如果我只是包括适当的头文件,什么样的事情我必须确保处理

谢谢你的帮助

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

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

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

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

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

插座/设置插座->插座/设置插座

在*nix下,默认情况下套接字是阻塞的,不需要也不可能使用奇怪的setsockopt调用来处理它

ioctlsocket->ioctl

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

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


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

这将取决于您是否使用了任何windows特定的网络功能,或者您是否只使用了与BSD最兼容的API

所以,如果您使用的是重叠的I/O和I/O完成端口以及Winsock API的其他高级部分,那么移植起来会非常困难,如果您只是使用BSD兼容的东西,那么编写一个精简的转换层应该很容易,甚至可以将Winsock启动和关闭的东西放在windows特定的ifdef中


这可能会有所帮助:

基于这一系列函数,事情或多或少应该是正常的。添加
#如果在调用
WSAStartup
WSACleanup
的周围添加
#WIN32
(linux的等效功能是不执行任何操作,套接字库将自动初始化)


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

我们的代码使用socket(),我发布了代码中使用的函数,因为我无法发布实际的代码。无法处理阻塞吗?你说得对,这是一个不同的函数,而不是
setsockopt
。本·沃伊特:没错。windows setsockopt调用在空句柄上调用,并为所有新套接字设置模式。我从未在空句柄上调用过
setsockopt
。这种行为记录在哪里?真有趣,我再也找不到网上的记录了。可能是因为我在初始化时仍在使用winsock的Win9x兼容版本号,所以它的行为很有趣。