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)