Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.006 c
2-1262255716
Александр К
2009-12-31 13:35
2010.03.07
Помогите перевести с c++ в pas (Оочень маленький участок кода)


11-1212953619
Elec3C
2008-06-08 23:33
2010.03.07
TKOLmdvXLGrid


2-1262601063
dragon3232
2010-01-04 13:31
2010.03.07
помогите с заданием


2-1262704720
ЭлЭрДжи
2010-01-05 18:18
2010.03.07
БД в Delphi (очень важная лаба, помогите пожалуйста)


15-1261690221
Юрий
2009-12-25 00:30
2010.03.07
С днем рождения ! 25 декабря 2009 пятница





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