Конференция "Сети" » Отправка информации по сокетам [D7]
 
  • Андрей (07.06.08 11:52) [0]
    Уважаемые, подскажите, как осуществляется отправка инфы конкретному клиенту по сокетам? Можно ли отправить напрямую без перебора всех активных. Как определить нужного клиента в этом случае? существует ли какой-нибудь идентификатор при подключении клиента к серверу?
  • DVM © (07.06.08 17:00) [1]

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

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


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

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


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

    Нужного кому? И для чего?
  • kami © (07.06.08 22:30) [2]
    > Андрей   (07.06.08 11:52) [0]

    1. Сперва скажи, какие сетевые компоненты и с какими настройками используешь
    2. Можно.
    3. см.1
    4. Да.
  • Андрей (11.06.08 10:30) [3]

    > DVM ©
    </I
    > kami ©

    >
    Использую стандартный набор ServerSocket/ClientSocket
    Принцип такой же, как в обычном чате. Один из пользователей отправляет сообщение (данные) другому через сервер. Как серверу определить, что инфу надо послать не всем сразу, а конкретному пользователю без перебора всего списка подключенных к нему?
  • Андрей (11.06.08 10:32) [4]
    Не разобрался еще, как тут вставляются цитаты, поэтому такое сообщение получилось :)
  • kami © (11.06.08 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;



    Конечно же, в примере не учитывается обработка ошибок и склейка/разбиение пакетов.
  • Сергей М. © (11.06.08 20:56) [6]

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


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

    Во-вторых, городить огород со списком  FClientList нет никакого резона -
    интересующая инф-ция о клиентах (RemoteAddress в частности ) доступна в списке Connections.
  • kami © (12.06.08 00:56) [7]
    > комбинацией IP-адрес:порт

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

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

    Да, но в этом случае поиск нужного клиента будет проводиться явно, а не скрываться в методах TStringList.
  • Anatoly Podgoretsky © (12.06.08 08:32) [8]
    > kami  (12.06.2008 0:56:07)  [7]

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

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

    Сделайте одолжение - расшифруйте эту фразу :)
  • Андрей (13.06.08 13:40) [10]

    > kami ©

    Спасибо за пример, попробую.
  • Тын-Дын © (14.06.08 10:21) [11]

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


    А что тут расшифровывать? Клиенты, сидящие за NAT, имеют один и тот же адрес IP. отличаются только портом, который NAT выдаёт.
  • Сергей М. © (15.06.08 15:39) [12]

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


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


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


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

    Два клиента на разных хостах для доступа к серверу пользуются одним и тем же NAТ- или proxy-сервисом - сервер будет их "видеть" под одним и тем же IP-адресом, но под разными портами.
  • kami © (16.06.08 22:24) [13]
    > Сергей М. ©   (15.06.08 15:39) [12]
    > А никто и не говорил об этом

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

    Все будет определяться задачей. Это может быть и (опять же к примеру) логин пользователя.
    Но, тем не менее - уели :)
 
Конференция "Сети" » Отправка информации по сокетам [D7]
Есть новые Нет новых   [134432   +19][b:0][p:0.001]