VB6.0にて、Microsoft Winsock Control6.0を使用した、
通信(TCP)中継用プログラムがあるのですが、
データ受信時に
「実行時エラー '40006':
指定したトランザクションまたは要求のプロトコルまたは接続状態に問題があります。」 というエラーが表示され、プログラムが終了します。
どこで、エラーになったか調査したところ、WinsockコンポーネットのGetDataでエラーが発生していました。
ソースは以下のように記述しています。(ソースが手元にないので思い出せる範囲です)
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim RecvData() As Byte
Winsock1.GetData RecvData,vbArray+vbByte,bytesTotal '←ココでエラー!
'以下適当な処理
これは受信データが一定サイズ(具体的には15kより大きいぐらいのとき)におこります。エラーにならないときもあります。10k以内ぐらいですと数万回送受信してもエラーが発生したことはありませんでした。
想定では、
1. コーディングの仕方がおかしい。
2. 配列の最大サイズ、もしくは変更サイズに限界がある。
3. MSWINSCK.ocxの1回の受信最大サイズに限界がある。
とか勝手に思っていたりするのですが、
この現象を直すための方法など分かりますでしょうか?
#適当にぐぐったり、過去ログみたりしましたが、見つかりませんでした。
#ちなみに、分割受信の対応などはやっています。(今思えば、最初からCや他の方法で作成しておけばよかったと思っていますが)
大事なことを書き忘れていました。
上記の15k、10kとは15000バイト、10000バイトという意味で書いております。
あと、
4.スタックサイズが限界
も疑っております。
↑この場合はスタックサイズの変更方法について教えてください。(←探し方が悪いのかWEBやMSDNなど1時間程度探しても見つかりませんでした。)
>上記の15k、10kとは15000バイト、10000バイトという意味で書いております。
これは書かなくてもわかるかな。
ところで最新のサービスパックはあたってますか。
http://support.microsoft.com/kb/319692/en-us
おお、なんかそれっぽいですね。
SP5で使用しています。SP6っていつもなんかよく分からない結果になるのですが、インストールしてみたいと思います。
というかXPのSP2でデフォで入っているOCXのバージョンが
6.0.81.69
でそこにあるものですと
6.0.95.24
なのですね。試してみたいと思います。
ありがとうございました。
6.1.97.82 ←DLしてみたらバージョンはこれでした。どうでもいいけど。
見事エラーは発生しなくなりました。
ありがとうございました。
ツイート | ![]() |