Главная страница
    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
4-1229691321
Ort
2008-12-19 15:55
2010.03.07
Неправильно работает нажатие на клавиши


15-1261447784
xayam
2009-12-22 05:09
2010.03.07
Проект Россия 3


15-1261314553
DanweR
2009-12-20 16:09
2010.03.07
Демонстрация сортировки


15-1261603824
Юрий
2009-12-24 00:30
2010.03.07
С днем рождения ! 24 декабря 2009 четверг


8-1180531137
Zeleniy
2007-05-30 17:18
2010.03.07
MediaPlayer и несколько файлов одного расширения.





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