Czytanie i pisanie do socketów w trybie SSL

0

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:

  1. klient łączy się z serwerem
  2. serwer zapisuje sobie jego socket w jakieś tablicy/mapie
  3. klient loguje się i jednoznacznie przypisany jest w trakcie połączenia do danego socketu
  4. 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...

1

Ok w jakiś wątkach o połączeniach SSL znalazłem coś takiego:

You cannot use different threads for reading and writing. OpenSSL is thread-safe with the limitation that an SSL session cannot be used across multiple threads.

Będę musiał się zastanowić nad przebudowaniem swojej aplikacji. Porobie jakieś testy ale przypuszczam, że też w moim programie to powoduje problemy.

0

Spróbuj synchronizować te operacje - jeśli jeden wątek coś robi ("czyta lub pisze") to drugi czeka, aż ten pierwszy skończy i dopiero wtedy zaczyna robić swoje.

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