2011-01-06 70 views
5

私は、Winsockを使用していくつかのネットワークを行うプログラムを持っています。私たちの要件は、現在、私たちのプログラムをLinuxに移植することです。これをやめることを止めるのはWinsockだけです。WinsockをLinuxソケットに移植する

私の質問は次のとおりです。これをLinux実装にどの程度簡単に移植できますか?

注意すべき落とし穴がありますか?単に適切なヘッダーファイルを含めるだけであれば、どのようなことを処理する必要がありますか?

ありがとうございました!

私はコードを投稿したいと思いますが、残念なことに法的な理由により私はできません。 しかし、我々のコードは次のように使用ん:

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

答えて

6

これは、Windows特有のネットワーキング機能を使用しているか、主にほとんどがBSD互換のAPIをほとんど使用しているかによって異なります。

Winsock APIのI/O完了ポートやその他の高度な部分を重複して使用している場合は、移植が非常に難しくなり、BSD互換のものを使用しているだけなら、 ...

薄い翻訳層を記述するかだけでも、窓の特定のifdef内のWinsockの起動とシャットダウンのものを持っていることは容易でなければなりませんこれは役立つかもしれない:機能のリストに基づいてhttp://tangentsoft.net/wskfaq/articles/bsd-compatibility.html

0

コードを見ることなく、いかに簡単であるかと言うことは難しいです。しかし、は、sys/sockets.hのアナログにwinsock呼び出しを置き換えることができます。

3

ポーティングが難しい呼び出しは、WSA *呼び出しだけです。

WSAStartupの() - > NOP WSACleanup() - > NOP

ソケット/のsetsockopt - >ソケット/のsetsockopt

の* nixの下では、ソケットはデフォルトでブロックされ、それが使用する必要がまたはことはできませんその奇妙なsetsockoptは、それとバイブルを呼び出します。

のioctlsocket - * nixの下で>のioctl

は、我々は、非同期ソケットをずっと好きで、select()システムコールを使用することを好みません。

----この答えの残りの部分は---- Win95の互換性のWinsockに適用するだけらしい

残念ながらいくつかのケースでは壊れていたのWinsockで、元のソケット()のように、あなたはおそらく使用やWSASocket

()とこれらの呼び出しを変換する必要があります。

+0

私たちのコードはsocket()を使用しています。実際のコードを投稿することはできません。 –

+0

ブロックすることはできませんか? [fcntl(2)を使用してソケットファイル記述子にO_NONBLOCKフラグを設定することで、ソケット上に非ブロック入出力を行うことができます。](http://linux.die.net/man/7/socket)それは、 'setsockopt'ではなく、別の機能だとは思います。 –

+0

Ben Voigt:正確に。ウィンドウズのsetsockopt呼び出しは、NULLハンドルで呼び出され、すべての新しいソケットに対してモードを設定します。 – Joshua

8

を、するべきより多くの事またはそれ以下の仕事だけ。 WSAStartupWSACleanupへの呼び出しのまわりで#if _WIN32を追加してください(Linuxの同等の機能は何もしない、ソケットライブラリは自動的に初期化されます)。

ソケットオプションを設定するときにOS依存のコードが必要な場合もありますが、その中にはいくつかのものがあり、いくつかは異なりますが、タイプが異なる場合もあります。

関連する問題