Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.26;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.08 c
1-1095075552
Chizh
2004-09-13 15:39
2004.09.26
Конструкция with...do


14-1094114975
Knight
2004-09-02 12:49
2004.09.26
Кто-нибудь сам мониторы фокусировал?


1-1094625734
kwSergio
2004-09-08 10:42
2004.09.26
совместимость Delphi и Builder


1-1094728927
Маяк_
2004-09-09 15:22
2004.09.26
Memo


3-1093675762
schoolboy
2004-08-28 10:49
2004.09.26
Append в ApolloTable