INDY i wysyłanie z serwera do klientów

0

Cześć, mam problem i nie wiem, na czym to polega, być może robię coś źle, a być może czegoś nie wiem.

OK, całość wygląda tak:
po połączeniu klienta do serwera, wysyła on mu komunikat stringiem, np: "Oto jest mój klucz szyfrujący", serwer zapisuje sobie klucz dla tego klienta i od tej pory komunikacja jest zaszyfrowana.
Następnie serwer odsyła do klienta poprzez Windowsową funkcję send odpowiedni komunikat, np: "OK, możesz pracować".

Wygląda to mniej więcej tak: (ServerExecute)

procedure TMainForm.IdTCPServer1Execute(AContext: TIdContext);
var
  msgType: integer;
  msgParams: TMsgParams;
  key: string;
begin
  //najpierw sprawdzam klucz klienta
  key:=ConnectedClients.GetClientKey(AContext.Binding.Handle);
  if key = '' then
  begin
    ParseMsg(AContext.Connection.IOHandler.ReadLn, MsgType, MsgParams);
    if MsgType = MSG_SET_KEY then SetKey(AContext.Binding.Handle, msgParams);
    exit;
  end;

//inny kod
  msgParams:=nil;
end;

I teraz tak, jeśli dla danego klienta nie ma klucza szyfrującego(key = ''), to wtedy trzeba sparsować komunikat i sprawdzić jego typ. To moje funkcje, które działają.
I teraz, co się dzieje w SetKey:

Najważniejsza rzecz to wywołanie tej procedury:

procedure SendMsg(Msg: string; SocketHandle: integer; DoCrypt: boolean);
var
  res: integer;
begin
  if DoCrypt then Msg:=CryptString(Msg, ConnectedClients.GetClientKey(SocketHandle));
  res:=Send(SocketHandle, Pointer(Msg)^, length(Msg), 0);

  res:=GetLastError;
  showMessage(IntToStr(res));
end;

Jako SocketHandle przekazuje oczywiście AContext.Binding.Handle

I teraz dziwna sprawa:
Zanim wywołam GetLastError to res ma wartość 3(po wywołaniu Send), natomiast po wywołaniu GetLastError wartość się zmienia na 0.

Oczywiście klient nie dostaje komunikatu albo robię to źle, ale robię to tymczasowo, jak w przykładzie. W procedurze Timera z interval na 500:

try
    msg:=TCPClient.Socket.ReadLn;
   if msg<>'' then showMessage('OK');
 except
    showMessage('Błąd');
    ListenerTimer.Enabled:=false;
  end;    

I czasami dostaję błąd: "Connection Closed Gracefully", a czasami nic się nie dzieje(wygląda jakby msg zawsze było puste)

0

a cy to to nie znaczy że ktoś po drugiej stronie kabla grzecznie się odłączył?
poszperaj jak tam masz pilnowanie połączenia po tej stronie co się rozłącza

0
PTwr napisał(a)

a cy to to nie znaczy że ktoś po drugiej stronie kabla grzecznie się odłączył?
poszperaj jak tam masz pilnowanie połączenia po tej stronie co się rozłącza

Ja mam to wszystko na jednym kompie i łączę się z pętlą zwrotną.

W końcu zrezygnowałem i zainstalowałem sobie TClientSocket i TServerSocket.

0

może to wina Indy, jedziesz na 10, gdzieś tam wyczytałem że niektóre wersje mają bugi, z I9 takich dziwadeł nie ma ( chyba )

1 użytkowników online, w tym zalogowanych: 0, gości: 1