首页  编辑  

Indy中如何检测多久没有收到任何数据包?

Tags: /超级猛料/Network.网络通讯/Sockt编程/   Date Created:
检查ID Socket多久内没有任何数据输入
/// 本函数从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;