現在、winsockを使った、PC間の通信プログラムを作っています。
片方のPCで、UNIXサーバと通信し、UNIXサーバから受信したデータを、そのまま
もう片方のPCに送る、というものです。
Winsock1.GetData data1, vbArray + vbByte
Winsock2.senddata data1()
デバッグモードで送信する箇所にブレークポイントを設定して、ステップ実行すると、うまく動作するのですが、ブレークポイントを設定せずに実行すると、うまく動作しません。 (もう片方のPCで受信のイベントが発生しません。)
勝手な想像なんですが、送信データがキューに貯められた状態で、実際に送信処理
が、なされていないのでは? と考えています
そこで、送信キューの中をフラッシュできないかと思ったのですが、そういったことは、できるのでしょうか?
あるいは、別に原因があるのでしょうか?
よろしく、ご教授お願いします
http://support.microsoft.com/default.aspx?scid=kb;ja;409932
に心当たりはないでしょうか?
上記URLでは1つのクライアントに対してSendDataを行う場合は問題ないと
書かれていますが、過去にTCPのプログラムを作ったときの記憶では
以下のような問題があったと記憶しています。
例えば10MBのデータを1回のSendDataメソッドで送信する分には問題ない
のですが、これを1MBずつ10回に分けてループ等で連続して送信すると
最初の数MBしか送信されなくなります。
対処としては1回SendDataメソッドを使用したら、SendCompleteイベント
が発生するまで待って次のSendDataを実行するようにして問題を回避しました。
原因は不明ですが上記方法で何回でも問題なく送信できるようになります。
送信キューのバッファをフラッシュするようなメソッドは見つからなかったし、
WinsockAPI群の中にもソレらしきものを見つけることが出来なかった(orz
で、ここからはオレの憶測なんだが、
UNIXから送られてくるデータをdata1()で読み取っているんだが、
「そのデータで全てのデータが送られてくる」
と仮定しているのが結構怪しいと思われる。
…これはもう、再現できる最低限のコードを書いてくれるしかないか、と思うが(orz
でもオレPC1台しか持ってないしなぁ…
※誤爆注i(ry
deさん、ガッさん、早速のレス、ありがとうございます。
SendCompleteイベントの件、今日はちょっとテストする環境がないので、
明日、さっそく試してみます。 教えて頂いたURLのページも大変参考しなりました。
UNIXから送られてくるデータは、確かに一度に全てではないですが、実は同時に自分のPCにも、送られてきたデータを表示してまして、こちらには正しく出力されています。
明日、またチャレンジしてみますので、宜しくお願いします
SendDataの後に、DoEventsを入れたら、うまく動作しました!
ありがとうございました
ツイート | ![]() |