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: 3% [?]

Related

Comments

Leave a Reply