Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.033 c
8-1088739507
jb
2004-07-02 07:38
2004.09.26
Площадь полигона


1-1094567567
Vova
2004-09-07 18:32
2004.09.26
Открытие файла в бинарном режиме


4-1092439003
SSSSS
2004-08-14 03:16
2004.09.26
Как на API переводить строки в Float и наоборот? Это возможно?


1-1094741152
Yurko
2004-09-09 18:45
2004.09.26
Кнопка в панели задач для НЕглавной формы


3-1093668134
Rost
2004-08-28 08:42
2004.09.26
работа с access





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский