Cześć, mam Delphi 2005.
Czasami mam problemy z połączeniem z serwerem.

Scenariusz połączenia wygląda tak:
Klient łączy się z serwerem(ClientSocket.Connect)
Serwer tworzy dla klienta nowy obiekt, losuje dla niego klucz i odsyła mu ten klucz.
Gdy klient dostaje klucz, wie, że jest połączony z serwerem i może wysyłać kolejne requesty.

Tylko problem polega na tym, że CZASAMI nie ma połączenia z serwerem. Bardzo ciężko jest to debugować, bo może zdarzy się 1 na 100 prób, że połączenia nie dostanie.

Może ktoś z Was miał już taki problem i sobie z nim jakoś poradził?

W kliencie łączę się z serwerem poprzez: ClientSocket.Connect

Następnie na serwerze jest zdarzenie OnAccept:

procedure TMyService.ServerSocketAccept(Sender: TObject;
  Socket: TCustomWinSocket);
var
  msgParams: TMsgParams;
begin
  ConnectedClients.AddClient(Socket.SocketHandle); //tworzę dla niego nowy obiekt

  //tworzę dla niego klucz
  setLength(msgParams, 1);
  msgParams[0].ParamName:='VAL';
  msgParams[0].ParamValue:=CreateCryptKey(10);

  //ustawiam mu ten klucz w swojej tablicy
  ConnectedClients.SetClientKey(Socket.SocketHandle, msgParams[0].ParamValue);

  //wysyłam mu ten klucz
  Socket.SendText(CreateMsg(MSG_SET_KEY, msgParams));

  msgParams:=nil;
 end;

Następnie wykonuje się kod w kliencie w OnConnect

procedure TMainForm.ClientSocketConnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  params: TMsgParams;
  msg: string;
  msgType: integer;
begin
  msg:=ClientSocket.Socket.ReceiveText; //odczytuję wiadomość

  if msg<>'' then
  begin
    ParseMsg(msg, msgType, Params); //parsuję ją sobie odpowiednio

    case MsgType of
      MSG_SET_KEY: SetKey(Params); //ustawiam klucz i wykonuję inne operacje
    end;

    Params:=nil;
  end;

end;

No i niby wszystko wygląda ok, niby wszystko działa ok, ale co ileś prób nie mogę się połączyć. Wyposażyłem aplikację też w timeout - realizuję to za pomocą komponentu TThreadedTimer - działania chyba nie trzeba tłumaczyć :)
Ale zdaje się, że w momencie, gdy nie chce się połączyć, to timer też nie chodzi.
Jednak aplikacja się nie zawiesza, bo działa przycisk ANULUJ.

Jednak jeśli wtedy zrobię np:
ClientSocket.Diconnect;
ClientSocket.Connect;
to też się nie połączy.