|
|
|||||||||
|
|||||||||
|
|
NW54 - Open Transport エラー -3151 および -3160 と Option Management(98 年 4 月 24 日)Q: OptionManagement 関数でエンドポイントのオプションを設定しようとすると、エラー-3151 (不正なオプション) または エラー -3160 (バッファオーバーフロー) のいずれかのエラーメッセージが通知されます。このエラーを解決するには何を調べたらよいでしょうか。
A: エラー -3151 は Open Transport のエンドポイントに対して不正なオプションまたは不正なオプション値が渡されたことを示します。以下の回答は エラー -3151 の一般的な原因は次の通りです。
1. オプションの長さが正しくありません。Open Transport の Option Management オプションの値の長さはほとんど 4 バイトです。しかし、文字列や構造体の値を取るオプションもあります。
エラー -3151 が最も発生するのは、オプションの値が 1 バイトなのに、4 バイトの長さが指定されている場合です。ここでも同様に、長さの引数は
2. optReq.flags = T_NEGOTIATE; optReq.opt.len = sizeof(optBuffer); // バッファのサイズを指定 optReq.opt.maxlen = sizeof(optBuffer); // <--- この行のコードを追加 optReq.opt.buf = (UInt8*) optBuffer; OTMemzero(optBuffer, sizeof(optBuffer)); opt->level = INET_IP; opt->name = IP_ADD_MEMBERSHIP; opt->len = sizeof(optBuffer); // オプションのサイズを指定
同じコードサンプルで、 上記の修正は「Open Transport SDK v1.3」以前の場合に該当します。
3. Open Transport v1.3 以前のバージョンを使用する際に既知の問題があります。 エラー -3160 の一般的な原因は次の通りです。
1.
2. Open Transport v1.3 以前のバージョンを使用する際に既知の問題があります。長さが 1 バイトか 2 バイトの TCP/IP オプションのネゴシエートで、応答バッファの長さを 4 バイトより小さい値に設定すると、Open Transport はこのエラーを返します。おもしろいことに、オプションのネゴシエート自体は成功する場合があります。この問題を回避するには、バッファサイズは 応答パラメータが指定されていないと、エラー -3160 は返されません。一方、返り値をチェックしないと、オプション設定の呼び出しのステータスが T_SUCCESS かどうか調べることができません。この問題は、次のオプションを設定しようとする場合に発生します。
OTMultiCastPitchSample.cp ファイルの変更と修正です。
修正 1: // // マルチキャスト送信の Time-to-live の値の設定 (デフォルトは 1) // TOptMgmt は再利用できるが、Option 自体は別。 // 上のバッファは再利用可能だが、正確を期すため正しい方法を取る。 // UInt8 ttlOptBuffer[ kOTFourByteOptionSize ]; // <-- 4 バイト長のオプションバッファ TOption* ttlOpt = (TOption*)ttlOptBuffer; optReq.flags = T_NEGOTIATE; optReq.opt.len = kOTOneByteOptionSize; // <-- オプション長は 1 バイトのまま optReq.opt.maxlen = sizeof(ttlOptBuffer); // <-- 応答バッファの最大長を設定 optReq.opt.buf = (UInt8*) ttlOptBuffer; OTMemzero(optBuffer, sizeof(ttlOptBuffer)); ttlOpt->level = INET_IP; ttlOpt->name = IP_MULTICAST_TTL; ttlOpt->len = kOTOneByteOptionSize; // <-- オプション長は 1 バイトのまま *(char*)(ttlOpt->value) = kDefaultTTL; err = gEndpt->OptionManagement(&optReq, &optReq);修正 2: IP_MULTICAST_LOOP オプションを設定するサンプルコードの変更
// // ループバックをオフにする - 自分で送信したパケットを受け取りたい場合はオフにしない // TOptMgmt optReq; UInt8 optBuffer[ kOTFourByteOptionSize ]; // <-- 4 バイト長のオプションバッファ TOption* opt = (TOption*)optBuffer; OTMemzero(optBuffer, sizeof(optBuffer)); optReq.flags = T_NEGOTIATE; optReq.opt.len = kOTOneByteOptionSize; // <-- オプション長は 1 バイトのまま optReq.opt.maxlen = sizeof(optBuffer); // <-- 応答バッファの最大長を設定する optReq.opt.buf = (UInt8*) optBuffer; opt->level = INET_IP; opt->name = IP_MULTICAST_LOOP; opt->len = kOTOneByteOptionSize; // <-- オプション長は 1 バイトのまま *(char *)(opt->value) = gLoopbackState; err = gEndpt->OptionManagement(&optReq, &optReq);
-- Rich Kubota [ Technical Q&A's : Communications & Collaboration : Networking : NW54 ] |
|