TIdUDPServerを使っての通信をしようとしていますが、BufferSizeを越える大きなデータ
を受け取ると、それ以降のデータが受信されません(OnUDPReadイベントが発生しない)
小さなデータでも短時間に大量に送られてくると同じように反応が無くなることがあります。
下のソースで、send2で送信している間は受信側で反応がありますが、send1で大きなデー
タを送ると受信側でIdUDPServer1UDPReadが呼ばれず、以降にsend2で送信しても受信側で
IdUDPServer1UDPReadが呼ばれなくなってしまいます。
バッファ溢れだとは思うのですが、受信側でそれを知る方法と、状態をリセットする方法が
いまいち分かりません・・。
C++Builder6を使っているのでVCLはDelphi6相当だと思います。
Indyのバージョンは8.0.25でした。
OSはwindosXPSP2です。
下のソースはC++のソースを書き換えたもので、ObjectPascalの経験が余りないので文法的
におかしな所はあるかもしれません。
【送信側】
procedure TForm1.send1();
begin
IdUDPServer1->SendBuffer(Host , Port , Buffer , 10000); // 大きなデータ送信
end;
procedure TForm1.send2();
begin
IdUDPServer1->SendBuffer(Host , Port , Buffer , 10); // 小さなデータ送信
end;
【受信側】
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
begin
Memo1.Lines.Add('Receive Data'); // デバッグ(データ受け取った)
end;
BufferSize以上のDataを送れば例外が発生してしまう。
理由は不明だけど、たとえBufferSizeを20000にしても、12280を超えるDataを送信すると、OnUDPReadイベントが発生しなくなるね。
コレ以上のDataを送るには、12280以下のサイズに分割して Sleep(10)くらいの間隔で連続送信するしかないような。
クライアントから送られてくるデータはどうにもならないので、
例外が発生すること自体はいいのですが、そのときの対処法が分かりません。
定期的にReceiveStringメソッドで0バイト読み出してみて例外が送られてくるかで状態は確認できるようですが、この方法も正しいものなのでしょうか?
また、この状態からの復帰方法も分かりません(以降のOnUDPReadイベントが発生しない)