/// 本函数从TCP中不断检查缓冲区,直到满 Size为止,
/// 如果任何时刻连续Timeout没有收到数据,则超时返回,此时一般是Socket出现问题了
/// 如果Timeout返回TRUE,否则返回FALSE
/// Timeout应该大于0
function IdCheckReadTimeout(TCP: TIdTCPConnection; Size, Timeout: Integer): Boolean;
var
LastReadTime: DWORD;
begin
Result := True;
LastReadTime := GetTickCount;
repeat
/// 10毫秒检查缓冲区,如果返回-1表示缓冲区没有收到数据
if TCP.ReadFromStack(True, 10, False) <> -1 then
begin
// 收到了数据,说明Socket有活动,要复位
LastReadTime := GetTickCount;
end
else if GetTickCount > (LastReadTime + Timeout) then
Exit;
until (TCP.InputBuffer.Size >= Size) or not TCP.Connected; /// 成功收到所有数据,没有超时
Result := False;
end;