Identyfikacja klientów [Sockety]

0

Temat był goglowany, ale rozwiązania jak dotąd dobrego nie znalazłem i zawsze były problemy z odpowiedziami :-P

Temat jest taki że musi to być mega bezpieczne, więc zamieszcze co sklecilem, może ktoś wyłapie jakiś bład bądź nakieruje mnie na lepsze rozwiazanie.

Problem : Stoi sobie serwer, jest powiedzmy podlaczonych 10 klientow. I teraz, jak wyslac dane do odpowiedniego klienta ? Wiec pomyslalem ze zrobie tak ze przy polaczeniu klienta, wysyla swoja nazwe np : KLIENT 1, wkladam to do tablicy przypisujac uchwyt. Schody zaczely sie przy tym jak dany klient moze sie rozlaczyc i ponownie podlaczyc (zmieniajac swoje polozenie i innych w mojej tablicy).
Serwerowi sa znane ewentualne nazwy klientow, wiec wybieram z ComboBoxa jego nazwe i wysylam komunikat.

type
  TSockets = record
    SID : string;
    Handle : Integer;
  end;

var
  Form1: TForm1;
  Sockets : array of TSockets;

procedure TForm1.Button_WyslijClick(Sender: TObject);
var
  I,J,Handle : Integer;
begin
  for I := 0 to Server.Socket.ActiveConnections - 1 do
    if(ComboBox1.Text = Sockets[I].SID) then
    begin
      Handle := Sockets[I].Handle;
      break;
    end;
  for J := 0 to Server.Socket.ActiveConnections - 1 do
    if(Server.Socket.Connections[I].SocketHandle = Handle) then
    begin
      Server.Socket.Connections[I].SendText('dsdsds');
      break;
    end;

end;

procedure TForm1.serverClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  SetLength(Sockets,Server.Socket.ActiveConnections);
end;

procedure TForm1.serverClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  I,J : Integer;
begin
  for I := 0 to Server.Socket.ActiveConnections - 1 do
    if(Socket.SocketHandle = Sockets[I].Handle) then
      break;
      for J := I+1 to Server.Socket.ActiveConnections - 1 do
      begin
        Sockets[J-1].SID := Sockets[J].SID;
        Sockets[J-1].Handle := Sockets[J].Handle;
      end;

  SetLength(Sockets,Server.Socket.ActiveConnections-1);
end;

procedure TForm1.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  s: AnsiString;
begin
  SetLength(s, Socket.ReceiveLength);
  SetLength(s, Socket.ReceiveBuf(Pointer(s)^, Length(s)));

  Sockets[Server.Socket.ActiveConnections-1].SID := s;
  Sockets[Server.Socket.ActiveConnections-1].Handle := Socket.SocketHandle;
end;
0

no ale jesli wskazujesz klientow recznie to w czym problem? po co wysylac jakies [CIACH!] ze sie polaczyles... w serversocket tworzona jest lista podlaczonych klientow a ty wysylasz tylko pod dany numer na liscie. Jesli zaznaczasz recznie to nie wazne czy jest na pierwszym miejscu na liscie a po ponownym polaczeniu juz na ostatnim. Dodajesz sobie podlaczonych klientow do tego combo (odswiezasz na bieŻąco combo), pobierasz numer polaczenia i wysylasz no chyba ze to za proste i za malo mega bezpieczne

0

No a skad mam wiedzieć że np polaczyl sie jakis zaklad z Warszawy, badz z Poznania a z Berlina nie ? I teraz w ktorym miejscu w tablicy jest dana stacja (czy w connections[0] czy connections[1] ?. Jak po podlaczeniu mam ich odroznic ? Wg mnie musza wyslac swoj identyfikator, i przypisuje je do danego SocketHandle.

0

no nie wiem skad masz wiedziec skoro nazywasz ich klient 1 ... itd i wiesz ze on jest z warszawy poznania lub berlina to chyba masz dar :) a tak na serio to moze umieszaj ich sobie w tablicy razem z numerem polaczenia. wtedy bedziesz wiedzial kto jest w connection[0]...[1]. jak ktos zniknie zmieniasz tylko wartosci numeru polaczenia. A i tak pisanie wszystkiego od zera nie bedzie mega bezpieczne wiec najlepiej skorzystaj z jakiegos gotowego komunikatora (znaczy jego protokolu)

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