2011-06-27 19 views
1

VxWorks sockLibはsetsockoptがwinsockのようにrecv呼び出しのタイムアウトを設定するために使用できるSO_RCVTIMEOオプションをサポートしていますか?ここで VxWorks sockLibは、setsockoptがwinsockのようにrecv呼び出しのタイムアウトを設定するために使用できるSO_RCVTIMEOオプションをサポートしていますか?

は、Windowsでのコールの例です:

int timeout = 30000; // 30 seconds 
status = setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(int)); 

このことについて混乱を招く事はのsetsockoptによって返されるステータスは、未知のオプションからエラーを示すものではありませんとSO_RCVTIMEOはsockets.hで定義されていることです。コールは依然として目的のアクションを生成しません。サポートされていることを示すドキュメントは見つかりません。

サポートされていない場合は、同等のアプローチの提案はありますか?

私はVxWorks 5.4を使用しています。私はそれがそれ以降のバージョンで動作するかどうかを知ることに興味があります。

+0

私はよく分かりませんが、ここでは考慮すべき点が1つあります。 WindowsではSO_RCVTIMEOにDWORDを設定していますが、ほとんどのUNIXではstruct timevalを使用しています。多分これは問題ですか?しようとするとどうなります:struct timeval tv; tv.tv_sec = 30; setsockopt(sockid、SOL_SOCKET、SO_RCVTIMEO、(char *)&tv、sizeof(struct timeval)); – ribram

+0

返事をありがとう。はい、私は改善なしで以前これを試しました。 – kingbob939

答えて

0

私はこの質問に直接答えることはできませんが、これらのタイプの「ブロッキング受信」スタイルの問題を解決するには、受信ソケットデータを待機している間にselect()関数を使用してタイムアウトを指定してください。次に、ソケットで利用可能なデータがあることがわかるまで、recv()呼び出しを完全にブロックすることを避けることができます。

このソリューションは、VxWorks(#include "selectLib.h")とLinuxおよびWindowsソケットライブラリ用にお勧めします。 SO_RCVTIMEOは便利ですが、すべてのオペレーティングシステムでselect()がさらに便利です。

関連する問題