Форум: "Сети";
Текущий архив: 2010.03.07;
Скачать: [xml.tar.bz2];
ВнизОтправка информации по сокетам Найти похожие ветки
← →
Андрей (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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c