Delphi에서 IdTcpServer 사용자 오프라인 검사 방법

1541 단어 Delphi
정상적인 상황에서 로그인한 사용자가 비정상적으로 오프라인 상태가 되면 서버에 알리지 않는다. 이때 서버는 사용자가 온라인인 줄 알고 이런 문제를 해결하는 데 다음과 같은 두 가지 방법이 있다. 첫째, 라운드 트레이닝 검사 연결 상황은 Timer라운드 트레이닝 검사가 필요하다. 다음과 같은 코드가 있다.
procedure TMainForm.Timer1Timer(Sender: TObject);
begin
  CheckForDisconnect();
end;

procedure TMainForm.CheckForDisconnect();
var
  lst:TList;
  I:Integer;
  User:TUser;
begin
  lst:=FUserList.LockList;
  try
    for I:=0 to lst.Count-1 do
      //     ,            OnExecute         ,    OnDsiconnet  
      User.Context.Connection.CheckForGracefulDisconnect;
  finally
    FUserList.UnlockList;
  end;
end;

 
여기서 FUserList는 로그인 사용자 엔티티 목록이며, 사용자 엔티티에는 IdTcpServer 사용자 스레드 정보가 들어 있습니다.2. 연결할 때 연결을 테스트하기 위해 WinSock2(인터넷에서 다운로드 가능)가 필요합니다. 코드는 다음과 같습니다.
uses WinSock2;

procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
type
  TCP_KeepAlive = record
    OnOff: Cardinal;
    KeepAliveTime: Cardinal;
    KeepAliveInterval: Cardinal
  end;
var
  Val: TCP_KeepAlive;
  Ret: DWord;
begin
  Val.OnOff:=1;
  Val.KeepAliveTime:=xxx;
  Val.KeepAliveInterval:=xxx;
  WSAIoctl(AThread.Connection.Socket.Binding.Handle, IOC_IN or IOC_VENDOR or 4,
    @Val, SizeOf(Val), nil, 0, @Ret, nil, nil)
end;  

 
마찬가지로 사용자 연결이 실패했을 때 OnExecute 이벤트에서 읽기 이상을 던진 다음 OnDisconnect 이벤트를 발생시킵니다.

좋은 웹페이지 즐겨찾기