2011-01-06 60 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沒有做任何事情,套接字庫自動初始化)。

設置套接字選項時,您可能還需要一些與操作系統相關的代碼,其中一些是相同的,有些不是,並且類型可能不同。