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

Вниз

Отправка информации по сокетам   Найти похожие ветки 

 
Андрей   (2008-06-07 11:52) [0]

Уважаемые, подскажите, как осуществляется отправка инфы конкретному клиенту по сокетам? Можно ли отправить напрямую без перебора всех активных. Как определить нужного клиента в этом случае? существует ли какой-нибудь идентификатор при подключении клиента к серверу?


 
DVM ©   (2008-06-07 17:00) [1]


> Уважаемые, подскажите, как осуществляется отправка инфы
> конкретному клиенту по сокетам? Можно ли отправить напрямую
> без перебора всех активных.

Конкретный клиент это который? В любом сучае у тебя будет список и поиск конкретного надо будет в нем выполнять.


> существует ли какой-нибудь идентификатор при подключении
> клиента к серверу?

Этот индентификатор и есть сокет.


> Как определить нужного клиента в этом случае?

Нужного кому? И для чего?


 
kami ©   (2008-06-07 22:30) [2]

> Андрей   (07.06.08 11:52) [0]

1. Сперва скажи, какие сетевые компоненты и с какими настройками используешь
2. Можно.
3. см.1
4. Да.


 
Андрей   (2008-06-11 10:30) [3]


> DVM ©
</I
> kami ©

>
Использую стандартный набор ServerSocket/ClientSocket
Принцип такой же, как в обычном чате. Один из пользователей отправляет сообщение (данные) другому через сервер. Как серверу определить, что инфу надо послать не всем сразу, а конкретному пользователю без перебора всего списка подключенных к нему?


 
Андрей   (2008-06-11 10:32) [4]

Не разобрался еще, как тут вставляются цитаты, поэтому такое сообщение получилось :)


 
kami ©   (2008-06-11 15:48) [5]

> Один из пользователей отправляет сообщение (данные) другому
> через сервер

Следовательно, в заголовке сообщения (данных) присутствует идентификатор того, кому эти данные адресованы.
Пусть это будет (к примеру) IP (строкой или 4 байтами).
Не претендуя на оригинальность/правильность решения, я бы сделал так:
TMyClass=class(Txxxxx)
private
 FClientList:TStringList;
 FServerSocket:TServerSocket;
//----------------
procedure TMyClass.OnClientConnect(..);
begin
 FClientList.AddObject(Socket.RemoteAddress, Socket);
 //-----------
end;

procedure OnClientDisconnect(..);
begin
 i:=FClientList.IndexOf(Socket.RemoteAddress);
 if i<>-1 then
   FClientList.Delete(i);
end;


Теперь при необходимости отправить данные кому-нибудь нужный сокет находится просто:
procedure SendData(ClientIP:String; Data:TStream (string, PChar etc...);
var
 Socket:TCustomWinSocket;
 i:integer;
begin
 i:=FClientList.IndexOf(ClientIP);
 if i<>-1 then
   begin
     Socket:=TCustomWinSocket(FClientList.Objects[i]);
     Socket.SendXXXXX(Data);
   end;
end;


Конечно же, в примере не учитывается обработка ошибок и склейка/разбиение пакетов.


 
Сергей М. ©   (2008-06-11 20:56) [6]


> kami ©   (11.06.08 15:48) [5]


Во-первых, уникальность партнера определяется не IP-адресом, а комбинацией IP-адрес:порт.

Во-вторых, городить огород со списком  FClientList нет никакого резона -
интересующая инф-ция о клиентах (RemoteAddress в частности ) доступна в списке Connections.


 
kami ©   (2008-06-12 00:56) [7]

> комбинацией IP-адрес:порт

Согласен целиком и полностью. Но вряд ли на одном компьютере будет устанавливаться 2 клиента чата.

> интересующая инф-ция о клиентах (RemoteAddress в частности
> ) доступна в списке Connections

Да, но в этом случае поиск нужного клиента будет проводиться явно, а не скрываться в методах TStringList.


 
Anatoly Podgoretsky ©   (2008-06-12 08:32) [8]

> kami  (12.06.2008 0:56:07)  [7]

До поры до времени, пока кто-то не окажется за НАТ


 
Андрей   (2008-06-13 13:36) [9]


> До поры до времени, пока кто-то не окажется за НАТ

Сделайте одолжение - расшифруйте эту фразу :)


 
Андрей   (2008-06-13 13:40) [10]


> kami ©

Спасибо за пример, попробую.


 
Тын-Дын ©   (2008-06-14 10:21) [11]


> Андрей   (13.06.08 13:36) [9]
>
> > До поры до времени, пока кто-то не окажется за НАТ
>
> Сделайте одолжение - расшифруйте эту фразу :)


А что тут расшифровывать? Клиенты, сидящие за NAT, имеют один и тот же адрес IP. отличаются только портом, который NAT выдаёт.


 
Сергей М. ©   (2008-06-15 15:39) [12]


> До поры до времени, пока кто-то не окажется за НАТ


Или за прокси-сервером.


> вряд ли на одном компьютере будет устанавливаться 2 клиента
> чата.


А никто и не говорил об этом.

Два клиента на разных хостах для доступа к серверу пользуются одним и тем же NAТ- или proxy-сервисом - сервер будет их "видеть" под одним и тем же IP-адресом, но под разными портами.


 
kami ©   (2008-06-16 22:24) [13]

> Сергей М. ©   (15.06.08 15:39) [12]
> А никто и не говорил об этом

А я и не говорил, что нужно обязательно использовать IP в качестве идентификатора :
> kami ©   (11.06.08 15:48) [5]
> Пусть это будет (к примеру) IP (строкой или 4 байтами).

Все будет определяться задачей. Это может быть и (опять же к примеру) логин пользователя.
Но, тем не менее - уели :)



Страницы: 1 вся ветка

Текущий архив: 2010.03.07;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.01 c
2-1262118378
Pavel
2009-12-29 23:26
2010.03.07
Ошибка при вызове GetInetFile


2-1262794714
antonn
2010-01-06 19:18
2010.03.07
запуск консольной утилиты с передачей ей параметра в OEM


2-1262510778
VertUS
2010-01-03 12:26
2010.03.07
из Memo2 в Memo1


15-1261465203
MonoLife
2009-12-22 10:00
2010.03.07
Кто-нибудь пользуется yahoo почтой?


15-1261101984
Kerk
2009-12-18 05:06
2010.03.07
«Лучший свободный проект России»