Hej!
No nie dam rady sam :( Przerasta mnie to...
Używam komponentów lNet (wiem, moge uzyc synapse). Kiedy nie łączę się w trybie SSL wszystko śmiga poprawnie. Kiedy jednak przełączam się na połączenie SSL zaczyna się sypać.
Ogólnie wygląda to tak:
- klient łączy się z serwerem
- serwer zapisuje sobie jego socket w jakieś tablicy/mapie
- klient loguje się i jednoznacznie przypisany jest w trakcie połączenia do danego socketu
- jak serwer chce coś wysłać do klienta to odszukuje jego ID w tablicy/mapie i wysyła dane na socket klienta.
Bez ssl wszystko działa tak jak powinno. Kiedy włącze ssl wszystko działa ok do momentu wybierania socketu z tablicy/mapy. W bezpiecznym trybie czego bym nie wybrał w takiej tablicy to wszystkie dane lecą do ostatnio połączonego klienta.
Zakładam, że pewnie źle robie to bezpieczne połączenie i obsługuje sockety. Proszę o pomoc albo nawet przykład jak to zrobić poprawnie bo najnormalniej w świecie brakuje mi wiedzy żeby to zrobić...
procedure TFormMain.LTCPComponentReceive(aSocket: TLSocket);
var
s: string;
begin
if aSocket.GetMessage(s) > 0 then
begin
//np. SomeArray[I]:=aSocket;
end;
end;
To tylko uproszczony fragment ale kiedy odbiore dane od klienta i okazuje się, że jest poprawnie zalogowany to zapisuje jego id i socket w tablicy.
Potem kiedy chce cos wyslac do konkretnego klienta cos z serwera to po prostu robie:
TLTCPComponent.SendMessage(SomeArray[I], Message);
bez aktywnego SSL wszystko jest ok. Po nawiązaniu bezpiecznego połączenie po wybraniu jakiegokolwiek klienta w tablicy wszystkie dane i tak lecą do ostatnio połączonego klienta.
Po stronie serwera całość tworze w ten sposób:
FCon := TLTCP.Create(nil); // create new TCP connection
FCon.OnError := @OnEr; // assign all callbacks
FCon.OnAccept := @OnAc;
FCon.OnDisconnect := @OnDs;
FCon.OnAccept := @OnAc;
FCon.OnReceive:= @OnRe;
FCon.Timeout := 100;
FCon.ReuseAddress := True;
SSL:=TLSSLSession.Create(nil);
SSL.CAFile:='sec/cert.crt';
SSL.KeyFile:='sec/key.txt';
SSL.Method:=msSSLv2or3;
FCon.Session:=SSL;
Pewnie inaczej trzeba zarządzać socketami ale nie mam pojęcia jak. Bardzo proszę o pomoc!
Nie musze nawet korzystac z komponentu lNet moze byc czyste OpenSSL ale nie wiem jak sie za to zabrac...