Indy 的 ReadTimeOut 设置失效?
最近在做MMS彩信接口程序,因为不使用Java平台,运营商所提供的Java版的MMS开发包无用,只好按照通信协议用indy直接连接服务端发送拼装好的数据封包来做处理。
为了将自己程序发出的封包和使用java开发包发出的数据包做对比,使用indy做了一个简单的tcpserver来接收发出的封包数据做保存。发现设置的ReadTimeOut设置无效,到了设置的超时时间仍然会处于阻塞状态,只有连接断开才可以继续下去。
网上搜索了一下,发现这个问题是Indy早期版本存在的Bug,indy采用的是阻塞模式,如果Server端未返回信息,这个readln会一直等下去,设置的TimeOut不会起作用(处于死循环中,没有跳出条件),是个BUG。
INDY团队给出的解决办法如下:
第一种:
对ReadFromStack函数的最后一小段做修改:
…
until (LByteCount <> 0) or (Connected = False);
…
修改为:
…
until (LByteCount <> 0) or (Connected = False) or (Result = -1);
…
第二种:
在 ReadFromStack() 的后面 // TimeOut 后面位置
…
// Timeout
if ARaiseExceptionOnTimeout then begin
raise EIdReadTimeout.Create(RSReadTimeout);
end;
Result := -1;
…
修改为:
…
// Timeout
Result := -1; // MOVED!
if ARaiseExceptionOnTimeout then begin
raise EIdReadTimeout.Create(RSReadTimeout);
end else // ADDED!
break; // ADDED!
…
按照以上方法中的一个做了修改,再次接受数据内容,不会处于死等问题。
Popularity: 6% [?]