TServerSocket - rozpoznawanie klienta

0

Jak podczas odbierania wiadmości od klienta (TServerSocket OnClientRead) rozpoznać, który z clientów (według Socket.Connections) nadesłał wiadomość? Szukam tego od dłuższego czasu i nic...:(

0

Rob tak:

Podczas akceptacji polaczenia tworz nowa pozycje w ListView'ie gdzie beda informacje o IP i Uchwycie klienta. Dzieki temu pozycje listvivew beda odpowiadaly pozycjom polaczen servera. Gdy klient sie rozlaczy to po prostu trzeba z listy usunac dana linie z danym IP i Uchwytem. Proste :)

0

Dzęki... Tylko jak zdobyc uchwyt klienta (jak go rozpoznawać przy każdym odbiorze danych)?
PS> Z adresem IP odpada, bo z jednego adresu można się kilka razy na ten sam (port i adres) połączyć...

0

var
IP: String;
Uchwyt: String;
Liczba: Integer;
begin
IP:=Socket.RemoteAddress;
Uchwyt:=IntToStr(Socket.SocketHandle);
Liczba:=0;
repeat
if (ListView.Items.Item[Liczba].Caption=IP) and (ListView.Items.Item[Liczba].SubItems[0]=Uchwyt) then
begin

 {Jakaś tam procka!}

Break;

end;
Liczba:=Liczba+1;
until Liczba=ListView.Items.Count;
end;

0

WIELKIE DZIĘKI!
praktycznie chodziło m o linijkę: [code]Uchwyt:=IntToStr(Socket.SocketHandle);[/code] ...

teraz zaczną się próby...

//hmmm... to działa - masz moją dożywotnią wdzięczność :)

0

Witam,

Mam identyczny problem, tworzę komunikator dla kilkunastu użytkowników.

Zablokowałem się na identyfikowaniu klientów.

Jak tylko dojdę w jaki sposób ich zidentyfikować to nie będzie problemu.

Zrobiłem list box-y, gdzie w równoległych polach zapisuje login, status, hasło, komenda, oraz nieszczęsny ID.

A teraz mówię dlaczego nieszczęsny.
Proszę o to fragment kodu odpowiadający za pobranie ID usera...
( podaje na przykładzie memo1, żeby było szybciej... - sens problemu oddany)

//Glupia procedura, ukazujacy pieprzony ID klienta ktory sie podlaczyl
Int := 0;
repeat
  if ServerSocket1.Socket.Connections[Int].SocketHandle = Socket.SocketHandle then
  begin
    memo1.lines.add('Użytkownik, ID:'+inttostr(int)+ '  IP : '+Socket.RemoteAddress + ' podlaczył sie. ');

    Exit;
  end;
  Inc(Int);
until Int = ServerSocket1.Socket.ActiveConnections;


// Glupia procedura, ukazujacy pieprzony ID klienta ktory sie podlaczyl

A teraz przy rozłączaniu:

// Glupia procedura, ukazujacy pieprzony ID klienta ktory sie rozlaczyl
Int := 0;
repeat
  if ServerSocket1.Socket.Connections[Int].SocketHandle = Socket.SocketHandle then
  begin
    memo1.lines.add('Użytkownik, ID:'+inttostr(int)+ '  IP : '+Socket.RemoteAddress + ' rozlaczyl sie. ');
    Exit;
  end;
  Inc(Int);
until Int = ServerSocket1.Socket.ActiveConnections;


// Glupia procedura, ukazujacy pieprzony ID klienta ktory sie rozlaczyl

I efekt jest taki:

Odpalanie klientów:
1
2
3

  • Poprawny, każdemu klientowi przypisywany jest poprawny ID

user image

A tak po zamknięciu klientów:

1
2
3

W tej kolejności...
user image

Wyłączamy pierwszego, ID 0 rozłączył się... ale oto ZONK, ID klienta 2 spadł też do 0 :(
i trzeci klient, też ID spadło do Zera...

Nie można jakoś dać, aby na stałe zapisywać tą tablicę, żeby przypisywała klientom tylko wyższe numery... macie pomysł aby to ominąć ?

Kasując, od końca, jest dobrze.

Czy nie dało by rady, aby ta głupia tablica users nie przesuwała się ?

Jakiś pomysł, Panie i Panowie ?

Będę wdzięczny za przykłady rozwiązania...

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