我目前正在涉及套接字的項目中,我只是使用Linux的sys/socket.h文件。將端口提交給Microsoft,並意識到Winsock是不同的。我想我有兩個問題。爲什麼Microsoft以不同的方式實現套接字?
首先,這兩種實現之間的主要區別是什麼?有沒有簡單的方法來「翻譯」他們?一個指南的鏈接將不勝感激,因爲你們可能會讓我比Google更好的質量鏈接。
其次,微軟爲什麼要這樣做?他們的動機是什麼?他們爲什麼不像其他人一樣保持相同的實施?
我目前正在涉及套接字的項目中,我只是使用Linux的sys/socket.h文件。將端口提交給Microsoft,並意識到Winsock是不同的。我想我有兩個問題。爲什麼Microsoft以不同的方式實現套接字?
首先,這兩種實現之間的主要區別是什麼?有沒有簡單的方法來「翻譯」他們?一個指南的鏈接將不勝感激,因爲你們可能會讓我比Google更好的質量鏈接。
其次,微軟爲什麼要這樣做?他們的動機是什麼?他們爲什麼不像其他人一樣保持相同的實施?
請原諒我,如果我錯過了這一觀點,但是您是否正在考慮WSARecv和家庭,並且認爲Windows上的整個套接字API與Berkeley套接字API不同?
Berkeley API確實存在於Windows上(請參見recv和系列),並且與任何其他Berkeley套接字實現基本兼容。
有關將套接字代碼移植到Windows的信息,請參閱MSDN文章"Porting Socket Applications to Winsock"。
哦,不,我不認爲整個API是不同的。否則,Windows計算機將如何與* nix計算機通信?但我只是想知道爲什麼語法不同。 – 2009-08-08 23:43:59
@Andrew:「奇怪爲什麼語法不同」:我的觀點是語法*不是*不同 - 與您在Linux上使用的相同的Berkeley套接字API也可在Windows上使用。還是我們在交叉目的?你有一個語法不同的例子嗎? – RichieHindle 2009-08-08 23:48:35
嘗試使用ACE - 它是一個很棒的跨平臺通信庫。
Milen在評論中表示,但Apache Portable Runtime庫涵蓋了許多網絡應用程序的可移植性問題。
The Winsock Programmer's FAQ有一個節,BSD Sockets Compatibility。 (披露:我是FAQ的維護者。)
我真的不覆蓋該文章中的理由和目的,所以:
WINSOCK.H VS SYS/socket.h中,ARPA /inet.h,netinet/in.h等。:這實際上我找到了一個改進。這都是一套緊密的功能,爲什麼不把它的所有定義放在一個頭文件中呢?
接近()與關閉套接字():早在窗形口3天的時候Winsock的被髮明,Windows的C++編譯器都具有某種POSIX API包裝的,提供便攜的一些基本的水平,包括關閉() 。這些只是調用到編譯器的stdio實現中,因爲DOS和Win16沒有Unices這樣的統一I/O機制。你不能僅僅在Win16的描述符上調用close(),並且不管它是文件,套接字,管道還是其他類型。 Win32在Winsock作爲NT 3.5的一部分發明的同時存在,它修復了這個問題,但是讓Winsock只能在NT衍生產品上使用,直到Windows XP才使得MS在互聯網上無關緊要。 MS的遊戲速度可能會很慢,但是那慢。底線,任何使用POSIX機制的BSD套接字中的任何與C++編譯器提供的現有API衝突的機制都無法在Winsock中實現。他們必須爲同一功能提供一個新名稱。
WSA *():這只是附加功能,提供了BSD套接字不支持的功能。其中很多都非常好,並且能夠在所有的Unices上看到類似的機制,但這很快就不會發生。有競爭的機制,如aio *(),但是這在所有的Unices中都不可用,對於Windows來說可移植性要小得多。您可以忽略它並堅持基本套接字API,但這並不總是在移植到Windows時的最佳選擇。
errno vs WSAGetLastError():errno是標準C的一部分,但錯誤值取決於C實現。請記住,Winsock一開始並不是微軟特有的東西。 DOS和Windows沒有開始使用標準的網絡API。這是由第三方提供的,他們都聚在一起發明了Winsock,並與微軟合作。最初的Winsock堆棧都是第三方的。他們無法寫出規範來覆蓋C RTL的errno值,原因有幾個。這些錯誤值屬於供應商提供的winsock.dll,與C RTL完全不同。
調用WSAStartup(),WSACleanup():再次,這是由於這樣的事實,WINSOCK.DLL最初提供的東西第三方,這與不是操作系統的一部分一些底層網絡堆棧接口。此外,還有Win16方面的事情:Win16無法看到程序剛剛死亡並自動清理其分配的資源。在程序退出之前你必須明確地釋放所有的東西,否則他們會被泄漏。
沒有readv()等:這在Winsock出生的第三方/ Win16世界中沒有意義。
一種方式來 「翻譯」 的Un * X到Windows - http://apr.apache.org/docs/apr/1.3/group__apr__network__io.html – 2009-08-08 23:33:49