6

私は C++ でいくつかのソケット関連のものを開発しようとしており、最初からソフトウェアを Windows と Linux の間でできるだけ移植できるようにしたいと考えています (後で移植できるようにするのは難しいです)。

私はさまざまなライブラリを見てきました.alhem.netのC ++用のライブラリがあり、もちろんboost::asioもあります。boost::asio は非常に有望に見えますが、この小さなアプリケーションにとっては非常に大きな依存関係になるでしょう。

自分で何かを書く価値はありますか、それともライブラリを使用するだけですか? 自分でやる場合、主な落とし穴は何ですか?

4

6 に答える 6

5

ソケットの周りにいくつかの移植可能なラッパーを開発しました。WinSock2 イベントで構成されている戻り値のない安っぽいレーンに行かないように注意してください。それ以外に、私が見ているように、最大​​の違いは次のとおりです。

  • Windows でネットワークを開始するには、 を呼び出す必要があります。Windows で::WSAStartup()シャットダウンするには、 を実行し::WSACleanup()ます。Linuxでは何もしません。
  • close()Linuxではclosesocket()Windowsでは、
  • デフォルトのバッファ サイズは、ドライバとオペレーティング システムの両方で異なるため、必ず と を使用して設定してSO_RCVBUFくださいSO_SNDBUF
  • SO_REUSEADDR は Windows でアドレスを盗み、Linux で頻繁に再オープンできるようにします。おそらく Linux でのみこのフラグを使用したいでしょう。
  • ::ioctlsocket()Windows、Linux ::fcntl()
  • ヘッダー ファイルが異なり、<sys/socket.h>Linux の友人、<WinSock.h>Windows の友人、
  • ポータブルにする最も簡単な方法は、おそらく::select()データが到着するのを待つことです。
  • fd_setWindows/Linux ではまったく異なります。fd_setこれは、任意のソケットを追加/削除する場合など、s の初期化を最適化する必要がある場合にのみ関連します。
  • Windows では、ソケットにかかっているスレッドは、ソケットが閉じられるとエラー コードで解放されます。Linux では、スレッドは待機したままです。スレッドがたとえば でソケットをブロックしている場合、 Linux でストールしているスレッドを解放するために::recvfrom()を使用することを検討してください。::sendto()

私が今まで必要としていた他のすべては、låda でうまくいきました。

于 2009-06-15T12:25:47.447 に答える
3

Winsocks は Posix ソケットとあまり互換性がありません:

  • Winsocks では、ソケットのタイプはSOCKETです。Posix では、これは単なるファイル記述子 ( ) であり、通常の呼び出しintを実行できます。read()write()
  • 同じ方法でエラーを返すことはありません。
  • recv()およびの一部のオプションはサポートされていませんsend()
  • 2 つの特別な関数を使用して、Winsocks ライブラリを初期化および初期化する必要があります。
  • shutdown()またはで Windows ソケットを閉じることはできないと思いますclose()closesocket()代わりみたいなものです。

もっと違いがあるはずですが、それが今私が覚えていることです。Winsocks との移植性が必要な場合は、ソケットを閉じたり、エラー メッセージを出力したりするための小さなライブラリが用意されています。

個人的には、おそらくboost::asio, を使用します (ただし、使用したことはありません)。

于 2009-05-06T14:04:28.683 に答える
2

「AdaptiveCommunicationsEnvironment」(ACE)ライブラリ をご覧ください。 (ACEホームページ) Windows、MacOS、Linuxをサポートするポータブルライブラリにすべてがまとめられた、優れた抽象化と多くの柔軟性を提供します。少し急な学習曲線がありますが、私はそれから非常に良い価値を得ました。

于 2009-06-16T07:18:41.897 に答える
1

これを見てください... http://sourceforge.net/projects/cpp-sockets/

于 2009-06-24T18:31:36.773 に答える
1

正直なところ、最初の優先事項としてboost::asioを使用します。本当にソケット API を使いこなしたい場合は、Windows と Linux の両方で標準の BSD スタイルのソケット API を使用できます。Windows では Winsock2 にリンク (および初期化) する必要があるだけですが、 Linux では、リンクする別のライブラリはありません。

于 2009-05-06T13:46:17.573 に答える
1

どのくらいのソケットを使用しますか? 私は、ソケットがかなり高レベル (オープン、読み取り、書き込み) で、Windows から Linux まで完全に機能するいくつかのアプリを作成しました。それ以上の場合は、ブーストを使用してください。

于 2009-05-06T13:47:46.197 に答える