2009-08-08 6 views
7

私は現在、ソケットに関するプロジェクトの途中です。Linuxのsys/socket.hファイルを使用しています。ポートをマイクロソフトにキューイングして、Winsockが異なることを認識します。私は2つの質問があると思う。マイクロソフトでは、ソケットが異なる方法で実装されたのはなぜですか?

最初に、2つの実装の主な違いは何ですか?それらを「翻訳」する簡単な方法はありますか?あなたがGoogleよりも質の高いリンクを手に入れることができるので、ガイドへのリンクは非常に高く評価されます。

第2に、マイクロソフトはなぜこれを行ったのですか?彼らの動機は何でしたか?なぜ彼らは他の人と同じ実装を保っていませんでしたか?

+1

国連は* WindowsにX「翻訳」するための一つの方法 - http://apr.apache.org/docs/apr/1.3/group__apr__network__io.html –

答えて

12

私はこの点を忘れてしまいましたが、WSARecvとその家族を見ていて、Windows上のソケットAPI全体がBerkeley Sockets APIと異なると考えていますか?

バークレーAPIはWindows上に存在します(recvおよびファミリを参照)。他のバークレーソケット実装との互換性はほとんどありません。

ソケットコードをWindowsに移植する方法については、MSDNの記事"Porting Socket Applications to Winsock"を参照してください。

+0

ああ、いや、私は全体のAPIとは思いませんでしたが異なっていた。それ以外の場合、Windowsコンピュータは* nixコンピュータとどのように通信しますか?しかし、私はなぜ構文が違うのだろうと思っていただけです。 –

+1

@Andrew: "なぜ構文が異なるのだろうか"と思っています。私の指摘は、構文が*異なっていないことです.Linuxで使用しているのと同じバークレーソケットAPIもWindows上で利用できます。あるいは、私たちは十字架の目的で話していますか?構文がどのように異なるかの例がありますか? – RichieHindle

0

ACEを使用してみてください - それは素晴らしいクロスプラットフォームのコミュニケーションライブラリです。

0

Milenはコメントの中で述べていますが、Apache Portable Runtimeライブラリは、ネットワークアプリケーションの移植性の問題の多くをカバーしています。

16

Winsock Programmer's FAQには、これに関するセクションがあります。BSD Sockets Compatibilityです。 (情報開示:私は、よくある質問のメンテナです。)

は、私は本当にその記事で疑問の解消やwhereforesをカバーしていないので、:SYS/socket.hに、ARPA対

  • WINSOCK.H /inet.h、netinet/in.hなど:これは実際には改善点があります。すべての機能が厳密に設定されているので、すべての定義を1つのヘッダーにまとめてみてはいかがですか?

  • 近い()対closesocket():Winsockのが発明されたときにWindows 3日で戻る、WindowsのC++コンパイラ、すべてが近い含め、可搬性のいくつかの基本的なレベルを提供するために、POSIX APIのラッパーのいくつかの種類を持っていました() 。 DOSやWin16はUnixのような統一されたI/Oメカニズムを持っていなかったので、これらはコンパイラのstdio実装を呼び出すだけでした。 Win16のディスクリプタでclose()を呼び出すだけで、ファイル、ソケット、パイプなどとは無関係に動作させることはできません。 Win32はWinsockがNT 3.5の一部として発明されたのと同時に存在していましたが、これを修正しましたが、WinsockをNT誘導体のみで利用できるようにすることで、Windows XPまでインターネット上では無関係になりました。 MSはゲームには遅くなる可能性がありますが、ではなく、が遅くなります。要するに、それをターゲットにしたC++コンパイラが提供する既存のAPIと競合するPOSIXメカニズムを使用するBSDソケットのものは、Winsockにはありませんでした。彼らは同じ機能に新しい名前を付ける必要がありました。

  • WSA *():これは機能追加であり、BSDソケットには追加されていません。その多くは本当にいいですし、すべてのUnicesで同様のメカニズムが見られることはうれしいですが、すぐには起こりません。 aio *()のような競合するメカニズムがありますが、これはすべてのUnixで利用できず、Windowsに移植するのがはるかに簡単です。これを無視してベースソケットAPIに固執することはできますが、これはWindowsに移植する際には必ずしも最良の選択ではありません。

  • errnoとWSAGetLastError():errnoは標準Cの一部ですが、エラー値はCの実装に従います。 Winsockはマイクロソフト固有のものではありませんでした。 DOSとWindowsは標準のネットワークAPIを持っていませんでした。これはマイクロソフトが関与しているWinsockをまとめて発明した第三者によって提供されたものです。最初のWinsockスタックはすべてサードパーティ製でした。いくつかの理由から、C RTLのerrno値を上書きする仕様を書くことができませんでした。これらのエラー値は、ベンダー提供のwinsock.dllに属し、C RTLとはまったく異なる世界です。

  • WSAStartupの()、WSACleanup()は:これも、最初はOSの一部ではない、いくつかの基本的なネットワークスタックとインタフェースの事に提供するサードパーティ、WINSOCK.DLLだったという事実によるものです。 Win16では、プログラムがちょうどなくなったことを知ることができず、割り当てられたリソースを自動的にクリーンアップすることができませんでした。プログラムが終了する前にすべてを明示的にリリースしなければなりませんでした。 READVの

  • 欠如()など:Winsockのが生まれたところこれは、サードパーティ/ Win16の世界では意味がありませんでした。

関連する問題