Главная страница
    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.038 c
1-1094663936
Antonmm
2004-09-08 21:18
2004.09.26
Рисование на экране


1-1094619109
DelphiN!
2004-09-08 08:51
2004.09.26
Формирование Меню по списку файлов и папок


14-1094133108
sesh
2004-09-02 17:51
2004.09.26
Красивые кнопенции, эдиты и т.д.


14-1094796322
dr Tr0jan
2004-09-10 10:05
2004.09.26
Функция "Grad"


14-1094779221
Soft
2004-09-10 05:20
2004.09.26
У американцев снова нашествие НЛО.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский