• Zalm © (31.08.09 13:14) [0]
  • DimaBr © (31.08.09 13:42) [1]
    Внимание! Здесь обсуждаются вопросы, связанные с разработкой компонентов, редакторов свойств, редакторов компонентов и экспертов IDE.
    Вопросы по поиску и использованию готовых компонентов, редакторов или экспертов являются нарушением тематики и могут быть удалены.
  • Сергей М. © (31.08.09 13:49) [2]
    Зависит от версии Инди
  • Zalm © (31.08.09 14:58) [3]
    Извиняюсь перед админами.

    Сергей, версия 10
  • Медвежонок Пятачок © (31.08.09 15:00) [4]
    и что бы узнать его адрес там и тд?

    Адрес и тд узнавать не надо. Он уже есть в сессии подключенного клиента
  • Сергей М. © (31.08.09 15:14) [5]

    > Zalm


    У любого наследника TIdCustomTCPServer, каковым является и TIdCmdTCPServer, есть публичное св-во Contexts, представляющее собой потокозащищенный список потоков, в контекстах каждого из которых исполняется каждое из активных соединений с клиентами.

    Каждый из элементов этого списка есть объект класса TIdPeerThread, у которого есть объектное св-во Connection, со всеми вытекающими)
  • Zalm © (31.08.09 16:16) [6]
    как раз таки я не заметил что бы из COnnection что-то вытикало, я его видел, но ничего конкретного из него мне получить неудалось
  • Медвежонок Пятачок © (31.08.09 16:22) [7]
    чтобы вытекание было заметным надо после коннекшена поставить точку и подождать подсказки иде
  • Сергей М. © (31.08.09 16:25) [8]
    Да уж, слона-то ты и не приметил)

    А справка, надо понимать, тоже молчит ?
  • Zalm © (31.08.09 16:39) [9]
    "Server.Contexts" вот тут ниче нет явно

    "Server.Bindings.Items[0].Handle" вот так можно что-то добиться, но тут УЖЕ надо знать индекс подключения, да и адрес не узнать....

    а справки у меня нету)
  • Медвежонок Пятачок © (31.08.09 16:40) [10]
    мало точек поставил
  • Медвежонок Пятачок © (31.08.09 16:41) [11]
    да и адрес не узнать....

    Интересно, что ты будешь делать, если узнаешь этот адрес.
  • Сергей М. © (31.08.09 16:43) [12]

    > "Server.Contexts" вот тут ниче нет явно


    Что значит "нече нет явно" ?


    > Server.Bindings


    Это из другой оперы, к клиентским коннектам оно отношения не имеет.


    > справки у меня нету


    Мыши сгрызли ?)

    Коли нету - купи, найди, укради.
    Без справки ничего путного не получится - так и будешь тыкаться как слепой котенок)
  • Anatoly Podgoretsky © (31.08.09 16:56) [13]
    > Сергей М.  (31.08.2009 16:43:12)  [12]

    А не умрет ли он скорее со справкой, ведь речь про ИНДИ
  • Сергей М. © (31.08.09 16:59) [14]

    > Anatoly Podgoretsky ©   (31.08.09 16:56) [13]


    Ну дык еще и исходники всегда перед носом)
    Довольно сложно сыграть в ящик, имея справку+исходники ..
  • Zalm © (31.08.09 17:04) [15]
    примеры у меня ткоа на 9-ю версию есть, там иначе всё написано.
  • Сергей М. © (31.08.09 17:10) [16]
    Скачай для 10-ки, в чем проблема ?
    Заодно и справку скачай.
  • Медвежонок Пятачок © (31.08.09 17:33) [17]
    и все же загадка. зачем ему понадобился адрес клиента.
  • Zalm © (31.08.09 17:46) [18]
    да адрес клиента не при чем, это я просто сказал что например как узнать.
    Главное как клиента идентифицировать что бы потом знать кто есть кто...
  • Медвежонок Пятачок © (31.08.09 17:56) [19]
    коннекшен - это и есть "кто"
  • Zalm © (31.08.09 18:27) [20]
    угу, если бы я писал через TServerSocket  я бы не задавал таких тупых вопросов.

    Ну вот разве что это что-то дельное AContext.Connection.Socket.Binding.Handle;
    и адрес там можно узнать.
    Тока пользы никакой для меня, в Server.Contexts я так и не нашел куда можно этот значение приспособить...
    Тока в Server.Bindings.BindingByHandle(HND).SendTo(); можно пихнуть... и то не получилось:(

    а примеры на 10-Ю версию не могу найти((
  • Медвежонок Пятачок © (31.08.09 18:29) [21]
    Дядя, в метод OnExecute сервера тебе передано нечто.
    Нечто это бывает разным в разных версиях инди.
    Вот это нечто и есть то что тебе надо. А так же все что вложено в этот тип.
  • Медвежонок Пятачок © (31.08.09 18:32) [22]
    для десятки это будет так:
    IdCmdTCPServer1Execute(AContext: TIdContext);

    вот этот контекст и есть то, что чего ты весь день ищешь
  • Zalm © (31.08.09 19:01) [23]
    а мне Execute не надо, я там ничего не пишу, всё только в командным обработчиках. А через OnConnect просто хотел записывать данные в массив о подключившихся что бы их как-то различать потом.
    только вот как записать в массив что-то конкретное из события OnConnect я так и енп онял... Не подскажете?
  • Сергей М. © (31.08.09 20:50) [24]

    > мне Execute не надо, я там ничего не пишу


    А куда ты денешься с подводной лодки ?
    Придется писать.


    > как записать в массив что-то конкретное из


    Не надо ничего никуда "пихать" - все уже давным-давно "напихано".

    В списке Connections.LockList каждый элемент - это TIdPeerThread.
    У TIdPeerThread есть объектное св-во Connection: TIdSocketHandle
    У объекта TIdSocketHandle есть св-ва PeerIP и PeerPort - адрес и порт клиента. Эта комбинация всегда уникальна, и этого достаточно для однозначной идентификации клиента.
    Кр.того, у объекта TIdSocketHandle есть send/recv-методы для коммуникации с клиентом.
  • Zalm © (31.08.09 22:55) [25]
    эх так и знал что вся подстава в этом LockList ((( я его открыл посмотрел и забил, ибо не показалось что как-то с сервером связано.

    А зачем обязательно в Execute писать?

    Спасибо большое, щас пойду пробовать.
  • Zalm © (01.09.09 03:35) [26]
    Я наверное что-то не понимаю... но у меня нельзя так сделать из любого места. Вот допустим я знаю порт и адрес, как вы сказали,
    Потом отсылаю в процедуру, адрес и порт, а когда хочу написать в процедуре Server.Connections то такого нет, есть только Server.Contexts.LockList а в лок-листе нет опять же свойства ни сокетов ни Connections...  опять я чего-то не понял? :(
  • Медвежонок Пятачок © (01.09.09 07:58) [27]
    ты сначала вот над этим порассуждай:
    присоединился клиент и висит на сервер. затем он отправляет на сервер команду.
    серверу в это время приходит в голову разослать всем клиентам сообщение и он это делает.
    а клиент в это время команду уже отправил и ждет свой законный ответ именно на нее.
    вместо этого он получает кусок байтов, которые он интерпретирует как ответ на команду.

    а на самом деле там у тебя там дрова лежат.

    ps
    для обмена между сервером и клиентом нужно стрго следовать какому-то стандартному протоколу, либо придумать свой протокол и следовать ему.
  • Сергей М. © (01.09.09 10:05) [28]

    > зачем обязательно в Execute писать?


    А ты и в Execute не напишешь.
    Execute вызывается только если у сервера список CommandHandlers пуст, а он у тебя заведомо не пуст, ибо нафих тогда нужен TidCmdTCPServer ?
    Ты пойми главное - TidCmdTCPServer не предназначен для выкрутасов задуманного тобой вида, он заточен и призван работать в режиме "команда клиента -> ответ сервера как результат выполнения этой команды". На то как раз ComandHandler'ы у него и существуют.
  • Zalm © (01.09.09 21:42) [29]
    А какие у меня выкрутасы?) вобще задача у меня такая, нужен сервер который будет как бы точкой переброса, короче надо что бы он мог создавать "пары" из соединений, и транслировать между ними (между членами в паре) трафик, в данном случае любой текст, который любой член этой пары захочет послать. Например один клиент передает команду на сервер, сервер принимает и смотрит от кого пришло и пересылает это тому кто находится в паре с этим клиентом. Да, такая спицифическая система)
    Тогда что вы бы посоветовали какой компонент использовать?
    Подскажите пожалуйста как лучше можно было бы сделать.
  • Сергей М. © (01.09.09 22:10) [30]

    > как лучше можно было бы сделать


    Пока не будет внятного разработанного тобой протокола информационного обмена, рассуждения на тему "лучше-хуже" лишены смысла.
  • Zalm © (01.09.09 23:13) [31]
    эх.. а конкретнее?
    что сложного сделать сервер котоый будет просто текст перебрасывать?
    ему же ничего не надо трогать, получил, передал дальше, и всё.
    Как я понял уже через TIdCmdTCPServer это не очень удобно делать.
  • Сергей М. © (02.09.09 09:11) [32]

    > что сложного сделать сервер котоый будет просто текст перебрасывать?


    А нашиша тогда выбрал TIdCmdTCPServer, если требуется "просто текст перебрасывать" ? Почекму не TIdTCPServer ? И чем так уж не угодил тот же самый TServerSocket, тем более что там для тебя "проще всё, ну или понятней" ?


    > а конкретнее?


    Вот сейчас мы с тобой "разговариваем" при использовании протокола информационного обмена HTTP.
    А ты разработал свой протокол ?)
  • Zalm © (02.09.09 17:20) [33]
    Я знаю что такое HTTP и как работает...
    Если это можно назвать "разработал", то можно и так, но только не для обмена с сервером "пересылки", а с конечными точками.
    TServerSocket мне не нравится так придется все потоки в ручную писать и много вобще придется писать.
    А на TIdTCPServer думаю проще будет, он и потоки сам создает же, и всё лучше... так что попробую через него.

    Еще вопрос такой мб сторонний немного, к этой теме относится только тем что тоже работа с сетью. Можно Как-то закосить сервер под сервер аси? что бы например конектится не к login.icq.com, а например к моему сервру, и что бы он клиенту контакт лист выдал и мог читать что этот клиент отправит на сервер? и не более. Больше ничего серверу не требуется кроме как выдать конаткт лист с заранее вписанными на сервер контактами, и читать что этим контактам будет слать клиент. То есть есть один сервер и один клиент.. ну думаю вы поняли задачу..)
  • Сергей М. © (02.09.09 17:31) [34]

    > но только не для обмена с сервером "пересылки", а с конечными
    > точками


    А "конечные точки" у тебя между собой напрямую не взаимодействуют.
    Они же у тебя "разговаривают" через твой сервер-посредник, так что и речь может идти не иначе как о протоколе инф.обмена между клиентами и сервером-посредником.


    > TServerSocket мне не нравится так придется все потоки в
    > ручную писать


    В смысле ?


    > Можно Как-то закосить сервер под сервер аси?


    Можно.
  • Медвежонок Пятачок © (02.09.09 18:35) [35]
    что сложного сделать сервер котоый будет просто текст перебрасывать?

    не сложно. сложно написать клиента который понял бы все перебрасываемое ему.
    хотя тоже не сложно (если самому себе не рыть ям)
  • Zalm © (02.09.09 18:52) [36]
    я знаю как всё написать, просто пока не определился точно к компонентом.

    Читая протокол я не понял какие команды сначала надо слать с сервера клиенту когда он подключится тока... я подключался с телефона к серверу, он подключается и молчит и чего-то ждет... где можно прочитать коротко какая последовательность компанд друг другу дожна быть что бы они подключились? Подскажете?
  • Сергей М. © (02.09.09 22:18) [37]

    > Читая протокол


    Как можно читать то, что ты еще не написал ?)


    > какие команды сначала надо слать с сервера клиенту


    А что, клиент нуждается в каких-то командах ?
    Нахрена, спрашивается, тогда нужен сервер, если клиенты готовы исполнять его прихоти ?)


    > какая последовательность компанд друг другу дожна быть что
    > бы они подключились?


    Никакая.
    Ты же сам утверждаешь, что якобы "подключался с телефона к серверу", при этом ни ты серверу, ни сервер тебе не посылал никаких "команд")
    Чудеса ?)
  • Anatoly Podgoretsky © (03.09.09 09:10) [38]

    > Ну дык еще и исходники всегда перед носом)

    Ну ты и садист.
  • Zalm © (06.09.09 05:14) [39]
    ох... вернулся к этой тему.. что-то я никак не пойму:( у меня не получается никак отправить кому-то что-то за пределы его потока.

    можете пожалуйста если вам не сложно показать кусок конкретного кода как отправить кому-то что-то не из его потока?
    Я был бы очень благодарен
  • Zalm © (06.09.09 16:47) [40]
    отправить через TidTCPServer, забыл уточнить
  • Сергей М. © (06.09.09 16:50) [41]

    > у меня не получается


    Показывай что делал ..
    С подробными комментариями движений своей мысли для каждой строчки своего кода ..
  • Сергей М. © (06.09.09 16:51) [42]

    > отправить через TidTCPServer, забыл уточнить


    Хоть через луну !

    Ход своей мысли продемонстрируй ..
  • Zalm © (06.09.09 21:13) [43]

    unit Unit1;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer, Buttons,
     idContext;

    type
     TForm1 = class(TForm)
       Server: TIdTCPServer;
       procedure ServerConnect(AContext: TIdContext);
       procedure ServerExecute(AContext: TIdContext);
     private
       { Private declarations }
     public
       { Public declarations }
     end;

     _Pack = Record
             Primary_handle : Cardinal;
             Secondary_handle : Cardinal;
             Primary_index : string[8];
             Secondary_index : string[8];
            End;

     {функция для того что бы составить пару из подключений}
     Function Connect_to_Clients( Handle : cardinal; index : string):boolean;
     {получение хэндла "соседа" пары, отправили свой handle, в ответе     получили его handle}
     Function GetHandleByHandle(Handle : cardinal):Cardinal;
     { "переброс" команд, отправляем свой handle, и что хотели отправить "соседу"}
     Procedure Transfer(handle : cardinal; str: string);

    var
     Form1: TForm1;
     Pack : _Pack;
     Clients : Array of _Pack;
     Clients_count : integer;

    implementation

    {$R *.dfm}

    procedure TForm1.ServerConnect(AContext: TIdContext);
    var
    str : string;
    begin
    AContext.Connection.Socket.WriteLn('Welcame'+#13+'Index[8]: ');
    Str:=AContext.Connection.Socket.ReadLn();
    if length(str)<>8 then
     begin
      AContext.Connection.Socket.WriteLn('Error length index');
      AContext.Connection.Disconnect;
     end
    else
     begin
      if Connect_to_clients(Acontext.Connection.Socket.Binding.Handle,str) then
       begin
        Acontext.Connection.Socket.WriteLn('Start transfer');
       end
      else
       begin
        Acontext.Connection.Socket.WriteLn('Error registration');
        AContext.Connection.Disconnect;
       end;
     end;
    end;

    Function Connect_to_Clients( Handle : cardinal; index : string):boolean;
    var
    i : integer;
    register_ : boolean;
    begin
    Result:=false;
    for i:=0 to Clients_count-1 do
     begin
      if ((Clients[i].Primary_index=index)or(Clients[i].Secondary_index=index)) then
       begin
        if Clients[i].Primary_index=index then
         begin
          Clients[i].Secondary_handle:=Handle;
          Clients[i].Secondary_index:=index;
          result:=true;
          exit;
         end;
        if Clients[i].Secondary_index=index then
         begin
          Clients[i].Primary_handle:=Handle;
          Clients[i].Primary_index:=index;
          result:=True;
          exit;
         end;
       end;
     end;
    inc(clients_count);
    SetLEngth(Clients,Clients_count);
    Clients[Clients_count-1].Primary_handle:=handle;
    Clients[Clients_count-1].Primary_index:=Index;
    Result:=True;
    end;

    procedure TForm1.ServerExecute(AContext: TIdContext);
    var
    msg : string;
    i : integer;
    begin
    msg:=AContext.Connection.Socket.ReadLn();
    if msg='\handle\' then
     begin
      AContext.Connection.Socket.WriteLn(IntTOStr(AContext.Connection.Socket.Binding.H andle));
      exit;
     end;
    if msg='\clients\' then
     begin
      for i:=0 to CLients_count-1 do
       begin
        AContext.Connection.Socket.WriteLn(
        '-----------------'+#13+'Couple '+IntToStr(i+1)+#13+
        'PH: '+IntToStr(Clients[i].Primary_handle)+#13+
        'PI: '+Clients[i].Primary_index+#13+
        'SH: '+IntToStr(Clients[i].Secondary_handle)+#13+
        'SI: '+Clients[i].Secondary_index);
       end;
       AContext.Connection.Socket.WriteLn('Done. '+IntToStr(Clients_count)+' couples.');
      exit;
     end;
    if msg='\couples\' then
     begin
      AContext.Connection.Socket.WriteLn(INtToStr(Clients_count)+' couples.');
      exit;
     end;
    if msg='\GetHandleByHandle\' then
     begin
      AContext.Connection.Socket.WriteLn(IntToStr(GetHandleByHandle(AContext.Connectio n.Socket.Binding.Handle)));
     end;
    Transfer(AContext.Connection.Socket.Binding.Handle,msg);
    end;

    Procedure Transfer(handle : cardinal; str: string);
    var
    _handle : cardinal;
    begin
    _handle:=GetHandleByHandle(handle);
    {...по идее тут отправка str подключению с известным нам _handle,
     это и есть товарищ из пары, вот только как отправить таким спобом
     этого я не знаю..:( }

    end;

    Function GetHandleByHandle(Handle : cardinal):Cardinal;
    var
    i : integer;
    begin
    result:=0;
    for i:=0 to Clients_count-1 do
     begin
      if Clients[i].Primary_handle=handle then
       begin
        result:=Clients[i].Secondary_handle;
        exit;
       end;
      if Clients[i].Secondary_handle=handle then
       begin
        Result:=Clients[i].Primary_handle;
        exit;
       end;
     end;
    end;

    end.



    вот, вроде как бы всё работает, но до определенного затыка в процедуре Transfer.
  • Сергей М. © (07.09.09 09:01) [44]
    Тихий ужас..

    Хендлы какие-то куда-то отправляются ..

    Ты в состоянии изложить формальное описание разработанного тобой протокола инф.обмена между клиентами и сервером ?
  • Сергей М. © (07.09.09 10:13) [45]
    За каким тебе понадобились хендлы, если у тебя есть список уникальных объектов IdTCP.Server.Connections, каждый из которых отражает контекст соединения сервера с одним из его активных клиентов ?
  • Zalm © (07.09.09 12:52) [46]
    да что есть? ничего там нет, просил же показать то о чем вы всё время говорите, так вы не можете.
    Зачем вам всё время нужен этот протокол я никак не понимаю, у меня проблема совсем в другом.
  • Zalm © (07.09.09 12:57) [47]

    > если у тебя есть список уникальных объектов IdTCP.Server.
    > Connections

    У вас может быть и есть, а у меня нету. есть только Server.Contexts в котором есть LockList в котором уже я ничего не нашел.
    Вот просил же хоть что-то показать конкретное, а вы мне только наводящие вопросы задаете, которые ни на что не наводят меня(
  • Сергей М. © (07.09.09 13:13) [48]

    > Зачем вам всё время нужен этот протокол я никак не понимаю


    Для того чтобы понять "язык", на котором ты пытаешься заствить разговаривать своих клиентов со своим сервером - что, кому, когда, в каком формате и при каких условиях передается/принимается

    Пойми, наконец, что без формализованного прикладного протокола инф.обмена ничего путного у тебя не получится. Любую сколь-либо серьезную сетевую разработку следует начинать с листа бумаги и авторучки, а не со слепого тыканья в компонентах.


    > у меня проблема совсем в другом


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

    Взять хотя бы элементарное, о чем я у тебя уже спросил в [45] ..
  • Сергей М. © (07.09.09 13:21) [49]

    > у меня нету. есть только Server.Contexts


    Да ну какая разница ?
    пусть будет не Connections, а Contexts - суть свойства от  этого не меняется.


    > LockList в котором уже я ничего не нашел


    Что и где ты искал из того что не нашел ?
  • Сергей М. © (07.09.09 13:23) [50]

    > вопросы задаете, которые ни на что не наводят меня


    Это печально. Очень.
  • Anatoly Podgoretsky © (07.09.09 13:24) [51]
    > Zalm  (07.09.2009 12:57:47)  [47]

    Так вопросы задаются, потому что от тебя не поступило полной информации,
    если не ты, то мы.
  • Сергей М. © (07.09.09 13:36) [52]

    > Zalm


    Ты вообще осознаешь, что работу с каждым из своих клиентов IdTCP-сервер осуществляет в отдельном дополнительном треде ?
    Судя по

    > У TServerSocket было проще всё, ну или понятней

    ты обязан это осознавать, ибо в режиме stThreadBlocking TServerSocket работает точно так же как и IdTCP-сервер.
    Если осознаешь, то почему не выполняешь обязательную синхронизацию доступа к потоконебезопасным ресурсам, таким как, например, массив Clients, переменную Clients_count ?
  • Zalm © (07.09.09 13:39) [53]
    Ну нету никакого протокола. В коде же видна идея как осуществляется обмен. При подключении "зарегистрировали" клиента, и всё, потом другой клиент подключается, такая же процедура, если они вводят один и тот же индекс, они получаются в паре, и сервер сразу передает между ними абсолютно всё что шлют (текст). Клиенты к этому серверу-посреднику обратиться никак не могут, ибо незачем.


    > За каким тебе понадобились хендлы, если у тебя есть список
    > уникальных объектов IdTCP.Server.Connections, каждый из
    > которых отражает контекст соединения сервера с одним из
    > его активных клиентов ?

    а как записывать какие-то данные о клиенте что бы потом знать кто с кем в паре? Записать хендл мне показалось более целесообразно так как я видел функцию BindingByHandle, я подумал что можно по обработчику пробиться до сокета который он обрабатывает. Но идея завалилась.
    А толку записать порт и адрес как вы говорили? что мне потом с ними делать?


    > > LockList в котором уже я ничего не нашелЧто и где ты искал
    > из того что не нашел ?

    Ну вот Server.Contexts.LockList  а дальше что? есть Items[index:integer]:pointer, это единственное что вызывает какое-то внимание, но сделать тоже ничего не получается с этим. Так что чем может помочь этот LockList я не понимаю, и вы подсказать не можете.

    видел кусок из примера для инди 9


    List := tcpServer.Threads.LockList;
     try
       for Count := 0 to List.Count -1 do
       try
         TIdPeerThread(List.Items[Count]).Connection.WriteLn(Msg);
       except
         TIdPeerThread(List.Items[Count]).Stop;
       end;
     finally
       tcpServer.Threads.UnlockList;
     end;


    Они себе в переменную типа TList копируют себе этот LockList и рассылают всем сообщение. ТОлько что такое  TIdPeerThread я не знаю, у меня такого нет. У них есть еще IdThreadMgrDefault1: TIdThreadMgrDefault; это в описании, тоже не знаю что это, у меня ткого нет.
    Вобщем жаль что не хотите ничего конкретного подсказать.
  • Zalm © (07.09.09 13:45) [54]

    > Ты вообще осознаешь, что работу с каждым из своих клиентов
    > IdTCP-сервер осуществляет в отдельном дополнительном треде
    > ?

    это да, это я знаю.
    > почему не выполняешь обязательную синхронизацию доступа
    > к потоконебезопасным ресурсам, таким как, например, массив
    > Clients, переменную Clients_count ?

    не знаю, я такого раньше не делал, проблем как мне казалось из-за этого не было. да и как это синхронизацию я не знаю, я с этим не сталкивался к сожалению
  • Медвежонок Пятачок © (07.09.09 13:48) [55]
    Ну нету никакого протокола.  

    У тебя ничего не получится.
  • Сергей М. © (07.09.09 13:51) [56]

    > Ну нету никакого протокола


    Ты прикидываешься или где ?

    Как это "нету" ?

    А это, к примеру, что по-твоему


    > 'Welcame'


    ?

    Почему именно "велцаме" у тебя фигурирует, а не "Здарофф, чувак ! Ет я, сервер, с тобой разговариваю" ?
  • Сергей М. © (07.09.09 13:57) [57]

    > Ну вот Server.Contexts.LockList  а дальше что?


    Ну и что толку тебе объяснять про "дальше что", если межпоточная синхронизация и защита ресурсов для тебя что новые ворота ?
  • Сергей М. © (07.09.09 14:04) [58]

    > что такое  TIdPeerThread я не знаю, у меня такого нет


    В 10-ке элементами этого списка явл-ся объекты класса TIdContext
  • Медвежонок Пятачок © (07.09.09 14:04) [59]
    про ресурсы ему еще рано.
    он кажется самого главного не понял:
    если хочется, чтобы сервер имел возможность отправки сообщения в произвольный момент времени, то клиент такого сервера должен постоянно висеть в процедуре чтения буфера и ни на что иное не отвлекаться.
    При этом он теряет возможность отправлять на сервер что-либо по своей инициативе.
    Причем на все время своей сессии.
  • Сергей М. © (07.09.09 14:12) [60]

    > про ресурсы ему еще рано


    Тогда и делать ему пока нефига в индейских серверах. Не по сеньке шапка.
    Есть TServerSocket, есть stNonBlocking - там ему "было проще всё, ну или понятней".
    Какого лешего ему понадобилось лезть в индейские мультипоточные блокирующие дебри - до сих пор не понятно.
    Было бы хотя бы вразумительное обоснование выбора Инди - был бы тогда и стимул вдалбливать ему про синхронизацию и прочую мультипоточную требуху. А так  - что о стенку горох)
  • Медвежонок Пятачок © (07.09.09 14:57) [61]
    правильная конфигурация:
    сервер постоянно читает запросы клиентов.
    получив запрос клиента, отправляет ему ответ, затем снова читает/ждет следующий запрос.

    рассылка всем клиентам сообщения по инициативе сервера:
    сервер получает текст сообщения от администратора и ничего никуда не посылает. Запоминает его и ждет, когда клиент запросит " А нет ли для меня какого-нить сообчения?"
    Получив подобный запрос клиента, сервер отдаети ему сообщение прямо в обработчике команд, без всяких локлистов и прочей ерунды.
  • Сергей М. © (07.09.09 15:09) [62]

    > без всяких локлистов и прочей ерунды


    В мультипоточном сервере без lock-тряхомудии вряд ли обойтись)
    Другой вопрос - она нада ли автору, мультипоточность та самая ..
    Впрочем, он и сам не знает.
  • Медвежонок Пятачок © (07.09.09 15:14) [63]
    локлист нужен для операций по инициативе сервера.
    допустим что клиент у нас "событийный", а сервер "процедурный".
    то есть все построено задом наперед.
    тогда да.
    лочим список коннектов, засылаем клиентам мессаджи и разлочиваем.
    если же сервер посторить как строят его нормальные герои (ожидание запроса->обработка->посылка ответа ), то лочить ничего не надо.
    все происходит либю в OnExecute, либо в диспетчерах прикладных команд.

    Но нах юный друг хочет чтобы и сервер и клиент были одновременно и сервером им клиентом.
  • Сергей М. © (07.09.09 15:34) [64]

    > лочить ничего не надо


    Ну как же не надо ?


    > все происходит либю в OnExecute, либо в диспетчерах прикладных
    > команд


    Все это происходит в контексте треда, обслуживающего текущий коннект.
    И тред этот и обслуживаемый им коннект полностью изолированы от прочих тредов сервера, обслуживающих как прочие коннекты, так и внутрикухонные нужды сервера. Все эти треды сервера так или иначе, рано или поздно обязательно пересекутся на доступе к тому или иному потоконебезопасному ресурсу, а, значит, потребуется синхронизация. Как она д.б. реализована - то ли локами, то ли синхр.сообщениями, то ли задействованием иных объектов илои способов синхронизации - другой вопрос.
  • Медвежонок Пятачок © (07.09.09 15:45) [65]
    Ну это само собой разумеется.
    Но я-то про Среадс.ЛокЛист говорил конкретно.
    Точнее про то, что он почти никогда не нужен правильному серверу.
  • Сергей М. © (07.09.09 15:47) [66]

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


    С этим солидарен.
  • Zalm © (07.09.09 17:05) [67]
    правильный сервер... я бы вобще не назвал то что мне нужно сервером.
    Вобщем ладно, спасибо вам за участие в теме, понял что помощи не будет
  • Медвежонок Пятачок © (07.09.09 17:17) [68]
    фигасе заявки. "помощи не будет".
  • Сергей М. © (07.09.09 17:18) [69]

    > я бы вобще не назвал то что мне нужно сервером


    Обзови его хоть горшком - как он был сервером, так он им и останется.
    Его задача - обслуживать (to serve) клиентов, если они не в состоянии сами себя обслужить.


    > помощи не будет


    Тебе уже 68 постов только и делают, что помогают, а ты все не внемлешь.
  • Сергей М. © (07.09.09 17:30) [70]

    > если бы я писал через TServerSocket  я бы не задавал таких
    > тупых вопросов


    Глубоко в этом сомневаюсь.
    Были бы другие, но не менее тупые.
  • Zalm © (07.09.09 17:48) [71]
    Server.Bindings.BindingByHandle(handle : cardinal)

    а это что делает?
  • Zalm © (07.09.09 17:51) [72]
    вот что сложного ответить на вопрос как отправить клиенту строку зная либо хендл, либо его адрес, либо его индекс подключения?)
  • Zalm © (07.09.09 18:07) [73]
    что вобще сложного в том сервере который мне нужен? та же структура что и у сервера аси, получил передал сразу вот и всё...
  • Медвежонок Пятачок © (07.09.09 18:10) [74]
    получил передал сразу вот и всё...

    не сразу, а только по запросу того, кому это предназначалось.
  • Медвежонок Пятачок © (07.09.09 18:14) [75]
    Вот я клиент твоей аси.
    И Сергей М. тоже клиент.

    Я нажимаю кнопку и запрашиваю инфо о контакте Сергея М.
    В это время он мне шлет сообщение "Превет Медвет"
    Сервер его получает и тут же сразу же мне его шлет.
    А я в это время отправил запрос о его профиле и жду его.
    А в ответ мне вместо данных его профиля приходит "Превет Медвет".
    Я (точнее твой чудо-клиент аси) при этом в полной уверенности что:
    1. Получил не сообщение, а инфу о профиле Сергея М
    2. Мне не пришло текстовое сообющение от Сергея М

    дальше разжевывать надо?
  • Zalm © (07.09.09 18:23) [76]
    ася что ли сидит и спрашивает у сервера есть ли для неё сообщения?

    вобще один товарищ посоветровал не возится с таким сервером "посредником" а связать компы не имеющие выделенных адресов через VPN. Тока я еще не совсем дочитал что это такое... так что пойду читать, мб и не нужен будет такой сервер...
  • Медвежонок Пятачок © (07.09.09 18:27) [77]
    ася что ли сидит и спрашивает у сервера есть ли для неё сообщения?

    Ты лучше спроси как она вообще получает сообщения ничего не запрашивая (якобы) и ничего не читая (якобы).
  • Медвежонок Пятачок © (07.09.09 18:29) [78]
    Хотя этот вопрос лишний.
    Ты попробуй сначала выкрутится из ситуации, что описана у меня в [75].

    Когда в ответ на запрос информации о контакте приходит не инфа о контакте, а "Превет Медвет".
  • Zalm © (07.09.09 18:34) [79]
    ну а что там выкручиться, сложности никакой.
    например синтаксис для собщения MSG_<сообщение>, а для инфы INFO_<инфа>, и какой тут напряг? придет себе сообщение, будет оно как сообщение, а инфу по-прежнему ждем
  • Сергей М. © (07.09.09 18:38) [80]

    > Zalm ©   (07.09.09 17:51) [72]


    А что ты хотел видеть в кач-ве ответа на этот вопрос ?


    > а это что делает?


    "Это" возвращает binding-структуру с интересующим значением поля handle.


    > та же структура что и у сервера аси, получил передал сразу
    > вот и всё


    Это тебе "сервер ася" сказал ?
    Или ты изучил документацию ?


    > вот что сложного ответить на вопрос как


    А что ты хотел увидеть в кач-ве ответа на вопрос ?
    Код ?
    Он тебе не поможет, уверяю тебя.
    Ты нишиша в нем не поймешь.
    Даже если ты сдуешь его "один в один", он у тебя работать не будет.
  • Zalm © (07.09.09 18:44) [81]

    > Это тебе "сервер ася" сказал ?Или ты изучил документацию
    > ?

    ну нет, я в начале второго курса писал подобие аси... в итоге всё работало нормально. всё передавалось и принималось.


    > А что ты хотел увидеть в кач-ве ответа на вопрос ?Код ?Он
    > тебе не поможет, уверяю тебя.Ты нишиша в нем не поймешь.
    > Даже если ты сдуешь его "один в один", он у тебя работать
    > не будет.

    почему это? это голословно))) не думаю что это мне не принесет никаких результатов... так что думаю вы ошибаетесь
  • Медвежонок Пятачок © (07.09.09 19:00) [82]
    procedure TForm1.Button1Click(Sender: TObject);
    var List : TList; i : integer;
    begin
    try
     List := IdCmdTCPServer1.Contexts.LockList;
     for i := 0 to Pred(List.Count) do
      with TIdContext(List[i]) do
       begin
        if (Connection.Socket.Binding.PeerIP = '1.2.3.4') and (Connection.Socket.Binding.PeerPort = 1234) then
         TIdContext(List[i]).Connection.Socket.Write('привет');
       end;
    finally
     IdCmdTCPServer1.Contexts.UnlockList;
    end;
    end;
  • Сергей М. © (07.09.09 19:31) [83]

    > я .. писал ..


    Я понимаю, что ты писатель, а не читатель.


    > не думаю что это мне не принесет никаких результатов


    Ты вообще не думаешь. Вероятно, не спрособен думать.
    Иначе давным бы давно реализовал кучу данных тебе подсказок.


    > Медвежонок Пятачок ©   (07.09.09 19:00) [82]


    Зря.
    Клиент скорее мертв.
    К тому он ханделЯми озабочен, а ты ему пир:порт)
  • Zalm © (10.09.09 20:25) [84]
    Сергей что ж вы злой такой?)

    Спасибо большое Пятачок)
  • Zalm © (11.09.09 02:26) [85]
    А TidTCPServer имеет какие-то функции\процедуры для подсчета входящего\исходящего трафика? или только руками можно посчитать?
    Подскажите пожалуйста)
  • Сергей М. © (11.09.09 08:29) [86]
    Тотальный подсчет трафика не предусмотрен.
    Однако есть события TIdTCPConnection.OnWork , TIdIOHandler.OnWork - их можно приспособить для тотального подсчета прикладного трафика.
  • Zalm © (11.09.09 17:37) [87]
    аа... Спасибо Сергей
Есть новые Нет новых   [134431   +10][b:0.001][p:0.005]