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...:(
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 :)
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ć...
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;
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ść :)
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
A tak po zamknięciu klientów:
1
2
3
W tej kolejności...
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...