Форум: "Сети";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
ВнизServerSocket - получение списка активных коннектов (DELPHI Найти похожие ветки
← →
tomas (2004-07-20 12:56) [0]Есть необходимость иметь сервер, который умеет посылать команды на клиентов (грохнуть запущенную прогу, отослать сообщение и т.д.) Я для этого использую SeverSocket и ClientSocket ...
И в принципе все успешно работает пока есть всего один клиент ....
Я посылаю команду следующим образом (получается типа квитанции - моментально отвечаю) :ServerSocket1.Socket.Connections[I].SendText("Ваше сообщение доставленно серверу ...")
проблемма встает когда мне нужно спустя какое то время послать что-либо выбранному клиенту (пятому из 10) - немогу получить номер его коннекта ...
Что я делаю :
For L := 0 to ServerSocket1.Socket.ActiveConnections-1 do
begin
Memo2.Lines.Add(IntToStr(L) + " :: " + Socket.RemoteAddress);
end;
И создаю лист бокс , где L = номеру коннекта ....
Когда входит первая машина поллучаю 1 - ***.***.***.1
Когда входит вторая машина поллучаю 1 - ***.***.***.1
2 - ***.***.***.1
И т.д. , т.е. я каждый раз получаю N ип-адресов последнего подключения ....
Как это порешить
← →
Digitman © (2004-07-20 13:41) [1]вот смотри, что происходит
после первого коннекта
№ коннекта IPадрес
1 XXX.XXX.YYY.YYY
после второго коннекта
№ коннекта IPадрес
1 XXX.XXX.YYY.YYY
2 YYY.YYY.YYY.YYY
после третьего коннекта
№ коннекта IPадрес
1 XXX.XXX.XXX.XXX
2 YYY.YYY.YYY.YYY
3 ZZZ.ZZZ.ZZZ.ZZZ
после дисконнекта клиента с IP-адресом XXX.XXX.XXX.XXX
1 YYY.YYY.YYY.YYY
2 ZZZ.ZZZ.ZZZ.ZZZ
вникни в связь между номером коннекта и клиентом, ассоциированным с ним в каждый момент времени и хорошенько пошевели мозгами - решение придет само собой
но не забывай, что в списке могут присутствовать более одного клиента с одним и тем же IP-адресом, т.е. идентификация клиента должна осуществляться по уникальной комбинации IP-адрес + порт
← →
tomas (2004-07-20 13:50) [2]Недошло !
ты тут не ту ситуевину расписал ....
у меня после превого:
1 zzz.zzz.zzz.zzz
приконнектился другой
1 aaa.aaa.aaa.aaa
2 aaa.aaa.aaa.aaa ...
ServerSocket1.Socket.ActiveConnections - это же массив с коннектами, почему при каждом подключении он заполняется IP последнего подключения ?
← →
Digitman © (2004-07-20 14:12) [3]
> у меня после превого:
> 1 zzz.zzz.zzz.zzz
> приконнектился другой
> 1 aaa.aaa.aaa.aaa
> 2 aaa.aaa.aaa.aaa ...
а куда zzz.zzz.zzz.zzz делся у тебя ? если он активен, то он должен быть первым в списке
> ServerSocket1.Socket.ActiveConnections - это же массив с
> коннектами
это список ссылок на объекты класса TServerClientWinSocket, каждый из которых отражает контекст соединения с отдельным клиентом
> почему при каждом подключении он заполняется IP последнего
> подключения ?
не говори ерунды
не "заполняется" он при каждом подключении , а в конец списка добавляется новый элемент, отражающий контекст вновь установленного соединения
← →
tomas (2004-07-20 14:40) [4]Ну я делаю следующую штуку :
1. у себя на компе запускаю сервер, ставлю точку прерывания в начале цикла ...
2. запускаю на одном из компов клиента , выполняю пошагово сервер - вижу тама IP машины, с которой подключились (цикл проходит 1 раз)
3. запускаю на втором компо клиента , выполняю пошагово сервер - вижу тама IP второй машины (цикл проходит 2 раза, IP одинаковый)
4. с каждой из машин посылаю на сервер пакет, каждая машина получает квитанцию (правильно получает) ...
А ВОТ СПИСОК АДРЕСОВ - N РАЗ АДРЕС ПОСЛЕДНЕЙ МАШИНЫ !
← →
Digitman © (2004-07-20 14:47) [5]
> tomas (20.07.04 14:40) [4]
бред какой-то ...
ты в состоянии привести ПОЛНЫЙ текст обработчиков событий OnClientConnect , OnClientRead, OnClientWrite, OnClientDisconnect ?
← →
Digitman © (2004-07-20 14:51) [6]
> Что я делаю :
> For L := 0 to ServerSocket1.Socket.ActiveConnections-1 do
> begin
> Memo2.Lines.Add(IntToStr(L) + " :: " + Socket.RemoteAddress);
> end;
этот цикл у тебя где находится, в обработчике какого события ? что есть в дан.случае объект Socket, у которого ты запрашиваешь св-во RemoteAddress ? какого класса этот объект ?
← →
tomas (2004-07-20 15:24) [7]procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
Var
L : integer;
begin
Memo1.Lines.Add ("Подключился клиент :"+ Socket.RemoteAddress + " : " + Socket.RemoteHost);
Memo2 - список приконнектившихся
Memo2.Lines.Clear;
For L := 0 to ServerSocket1.Socket.ActiveConnections-1 do
begin
Memo2.Lines.Add(IntToStr(L) + " :: " + Socket.RemoteAddress);
end;
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
Var
I : integer;
begin
For I := 0 to ServerSocket1.Socket.ActiveConnections do
begin
If ServerSocket1.Socket.Connections[I] = socket then break;
end;
Memo1.Lines.Add (IntToStr(I) + ">" +InTtoStr(Socket.SocketHandle) + ">" + Socket.ReceiveText);
ServerSocket1.Socket.Connections[I].SendText("Ваше сообщение доставленно ...")
end;
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1.Lines.Add ("Отключился клиент "+ Socket.RemoteAddress + " : " + Socket.RemoteHost);
Memo2 - список приконнектившихся
Memo2.Lines.Clear;
For L := 0 to ServerSocket1.Socket.ActiveConnections-1 do
begin
Memo2.Lines.Add(IntToStr(L) + " :: " + Socket.RemoteAddress);
end;
end;
← →
Digitman © (2004-07-20 15:38) [8]const
WM_REFRESH_LIST = WM_USER + 3000;
type
TForm1 = class(TForm)
private
procedure MsgRefreshList(var message: TMessage); message WM_REFRESH_LIST;
end;
procedure TForm1.MsgRefreshList(var message: TMessage);
begin
Memo2.Lines.Clear;
for l := 0 to ServerSocket1.Socket.ActiveConnections-1 do
begin
Memo2.Lines.Add(IntToStr(i) + " :: " + ServerSocket1.Socket.Connections[i].RemoteAddress);
end;
end;
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
Var
L : integer;
begin
Memo1.Lines.Add ("Подключился клиент :"+ Socket.RemoteAddress + " : " + Socket.RemoteHost);
PostMessage(handle, WM_REFRESH_LIST, 0, 0);
end;
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1.Lines.Add ("Отключился клиент "+ Socket.RemoteAddress + " : " + Socket.RemoteHost);
PostMessage(handle, WM_REFRESH_LIST, 0, 0);
end;
← →
tomas © (2004-07-20 15:47) [9]Спасибо !
Заработало все шо надо !
С меня пиво !
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.038 c