0

TCP/IPをクライアントとして使用して外部デバイスと通信するアプリケーションを作成しました。通信にSynapseライブラリ(v40)を使用しています。ただし、通信がフリーズすることがあります。JclDebugを使用してコールスタックを取得できました。これは、タイムアウトが定義されているにもかかわらず、パケットの受信が問題であることを示しています。

Delphi2009が使用されます。

この問題を解決するために私にできることはありますか?シナプスのバグ?

[77297094] KiFastSystemCallRet 
[006193FE] blcksock.TBlockSocket.InternalCanRead (Line 2741, "synapse\blcksock.pas") 
[0061945C] blcksock.TBlockSocket.CanRead (Line 2764, "synapse\blcksock.pas") 
[006185E5] blcksock.TBlockSocket.RecvPacket (Line 2324, "synapse\blcksock.pas") 
[0061888F] blcksock.TBlockSocket.RecvTerminated (Line 2410, "synapse\blcksock.pas")    
... my own code..

編集:ブロッキングラインは次のとおりです。

x := synsock.Select(FSocket + 1, @FDSet, nil, nil, TimeVal);

Select-functionはwinsock2APIからのものです。

Edit2: TimeValはSynapseコードによって設定されます:

var
  TimeVal: PTimeVal;
  TimeV: TTimeVal;
..
  TimeV.tv_usec := (Timeout mod 1000) * 1000;
  TimeV.tv_sec := Timeout div 1000;
  TimeVal := @TimeV;
  if Timeout = -1 then
    TimeVal := nil;

元のソースコードはここにあります:http ://synalist.svn.sourceforge.net/viewvc/synalist/trunk/blcksock.pas?revision = 154&view = markup

使用されるタイムアウトは1000です。

Edit3: 2つの異なるホストと通信するために2つのクライアントスレッドを実行しています。他のものだけがぶら下がっているようです。アプリケーションは木曜日から実行されています。スレッド#2は5時間後にハングしましたが、スレッド#1はまだ実行中です。

4

1 に答える 1

1

フリーズの理由が見つからなかったので、コードを少し変更して、'>'ではなくCRLFをターミネーターとしてRecvTerminatedを呼び出すことになり、停止せずに動作するようです。

于 2012-09-23T09:38:30.350 に答える