На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

Не приветствуется поднятие старых тем. Если ваш вопрос перекликается со старой темой, то для вопроса лучше создать новую тему, а старую указать в первом сообщении с описанием взаимосвязи.

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
  
> UDP server
    добрый день.
    не сталкивался с UDP и возник вопрос.
    в TCP после открытия порта - он занимается. а в UDP так же?

    пробывал поднять сервер по примеру как тут http://www.ithowto.ru/66-primer-raboty-s-k...udp-server.html
    на Indy - не случается событие IdUDPServer1UDPRead

    посылаю пакет широковещательно при помощи утилиты скаченной из интернета.

    не ясно что делаю не верно
    http://joxi.ru/v29J6NDcZnKQAG
      У вас порт привязан к IP адресу. Т.е он фильтрует по нему запросы.
      Что-бы принимать все пакеты надо ставить 0.0.0.0
      Во-вторых смотрите снифиром, что куда идёт. А то в последних виндах широковещательную рассылку сделали "привилегированной" операцией.
        спасибо за подсказку. попробую
        сторонее приложение которым я отправляю - точно вешает широковещательный пакет. на ардуинке принимаю его и в ответ отправляю

        хотел заменить чужое приложение своим на Delphi - самостоятельно общаться по UDP с своей ардуинкой.
        пока пытаюсь вещать широковещательно пакет чужим приложением и на этом же компьютере принимать его.

        интересно что в Delphi есть IdUdpServer и UDPServer два компонента.
        Сообщение отредактировано: Emmys -
          нет. видимо все равно что то не так делаю
          отправляю пакеты но они не доходят до приложения на дельфи
          http://joxi.ru/LmG31j4cwO0Vml
            нашел пример отправки.
            http://www.sources.ru/delphi/internet/send...dp_packet.shtml

            во первых Target.sin_addr.S_addr:=INADDR_BROADCAST;
            говорит что превышены пределы
            ну ок. заменил на это и все равно не отправляется UDP:

            ExpandedWrap disabled
              procedure sendUDP(sUDPPacket:string);
              var Init:TWSAData;
                  SockOpt:BOOL;
                  Sock:TSocket;
                  Target:TSockAddrIn;
                  Buffer: array[0..2047] of byte;
                  h:integer;
              begin
               WSAStartup($101,Init);
               Sock:=Socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
               SockOpt:=TRUE;
               SetSockOpt(Sock,SOL_SOCKET,SO_BROADCAST,PansiChar(@SockOpt),SizeOf(SockOpt)) ;
               Target.sin_port:=htons(51234);//номер порта
               Target.sin_addr.S_addr:=inet_addr(Pansichar(ChatForm.EditSendAddr.Text));;
               Target.sa_family:=AF_INET;
               
               
               
               
               
              h:=0;
              while h<=length(sUDPPacket)-1 do  begin
              Buffer[h]:=ord(sUDPPacket[h+1]);
              inc(h);
              end;
               
               
               SendTo(Sock,Buffer[0],length(sUDPPacket),0,Target,SizeOf(Target));
               WSACleanup;
              end;
              закрыто.

              скачал пример отсюда http://cybern.ru/udp-delphi.html
              изменил его как мне нужно. удобный Untit UDP
                и все таки почему компонент IdUDPServer1 не работает.
                я бы хотел в потоках работать и создать там IdUDPServer1 и получать с него данные.

                из того что я привел пример выше - в потоке не получится как я понял. т.к. при повторном обращении к UDP.pas старый сокет будет изменен. он там получается как бы общий.
                  непросредственно idUDPClient работает
                    Emmys
                    У меня был такой код:
                    Сервер:
                    ExpandedWrap disabled
                      procedure TForm1.FormCreate(Sender: TObject);
                       begin
                       UDPServer.Bindings.Add.Port:=666;
                       UDPServer.Active:=True;
                       end;
                       
                      procedure TForm1.UDPServerUDPRead(Sender: TObject; AData: TStream;
                        ABinding: TIdSocketHandle);
                       var
                       sl:TStringList;
                       Msg:string;
                       begin
                       sl:=TStringList.Create;
                       sl.LoadFromStream(AData);
                        Msg:=sl.Text;
                       Delete(Msg,Length(Msg)-1,2);
                         if Msg='ClientConnect' then ShowMessage('Fuck');
                       sl.Free;
                       end;


                    Клиент:
                    ExpandedWrap disabled
                      procedure TForm1.FormCreate(Sender: TObject);
                       begin
                       UDPClient.Send('255.255.255.255',666,'ClientConnect');
                       end;
                      когда я двойным кликом формирую то получаю вот это - отличается от вашего
                      ExpandedWrap disabled
                            procedure IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
                              AData: TArray<System.Byte>; ABinding: TIdSocketHandle);


                      обратите внимание я еще косяк получаю
                      ExpandedWrap disabled
                        TArray<System.Byte>
                      - меняю в ручную его на
                      ExpandedWrap disabled
                         TBytes


                      может в этом причина?

                      Добавлено
                      мне очень нужно это реализовать. все встало из за этого сервера
                      Сообщение отредактировано: Emmys -
                        Emmys
                        Это было на 7 delphi, попробуйте не инди компонентами реализовать.
                          ^D^ima, у меня знаний не хватает как это сделать в потоке. мне нужно именно в потоке. по этому хотел через Create именно этим компонентом
                          я нашел рабочий пример на winsock но как его сделать в потоке - не имею понятия
                            Цитата Emmys @
                            ^D^ima, у меня знаний не хватает как это сделать в потоке.

                            Всё точно так же.
                            1. Создаём сокет.
                            2. Делаем Bind
                            3. Используем select, для получения статуса сокета и последующего его чтения.
                            4. При чтении данных заполняется структура sockaddr_in, откуда получим IP и порт отправителя.
                            Туда будем отправлять ответ.
                            Сообщение отредактировано: ЫукпШ -
                              ЫукпШ. я установил другую версию дельфи там все ок - работает
                              но я использую сторонние компоненты поэтому хотелось бы именно в этой версии все реализовать
                              выходом из положения вижу удаление индии и установка актуальной

                              не могли бы вы помочь как это сделать. ставлю на дельфи XE
                                http://joxi.ru/v29J6NDcZMEbAG
                                не могу победить. удаляю файл. нажимаю Install и получаю это
                                Сообщение отредактировано: Emmys -
                                  Цитата Emmys @
                                  не могли бы вы помочь как это сделать. ставлю на дельфи XE

                                  я не использую Дельфи, только с++.
                                  Но общий путь решения я дал.
                                    и все таки. прошу помочь разобраться как установить Indy на Delphi XE. сложновато

                                    Добавлено
                                    воспользовался советом на этом форуме
                                    http://forum.ru-board.com/topic.cgi?forum=...1977&start=1020

                                    взял программу и нашел куда именно обращается дельфи и смог нормально установить Indy
                                    Сообщение отредактировано: Emmys -
                                      ЕЩЕ ВОПРОС:

                                      1. создаю поток. код уже есть - программа рабочая
                                      ExpandedWrap disabled
                                        ArrayTheard[id]:=TExecuteThread.Create(MyMutex1,id, num,sort_num,run_only_sort_num,word,room,dynamicnum,value);




                                      2. Тело потока
                                      ExpandedWrap disabled
                                        procedure TExecuteThread.Execute;
                                        begin
                                         
                                        UdpServer=TidUPDServer.create(nil)
                                        //создаю компонент
                                         
                                        //даю настройки его
                                         
                                        UdpServer.active:=true
                                        //запускаю
                                         
                                         
                                         
                                        while x<>"stop" do begin
                                         
                                        ЕСЛИ ПРИШЛИ ДАННЫЕ С IdUDPServer1UDPRead ТО ЗАПИСЫВАЮ ИЗ В БД
                                         
                                        end;
                                         
                                         
                                         
                                         
                                        UdpServer.Destroy
                                        ///уничтожаю
                                         
                                        end;






                                      ВОПРОС - как мне реализовать:

                                      while x<>"stop" do begin
                                      ЕСЛИ ПРИШЛИ ДАННЫЕ С IdUDPServer1UDPRead ТО ЗАПИСЫВАЮ ИЗ В БД
                                      end;


                                      в частности не понимаю как обрабатывать в потоке IdUDPServer1UDPRead
                                      т.е. что бы все работало верно - запускаю 20 серверов с разными настройками - каждый что бы имел свою обработку IdUDPServer1UDPRead и реализовать её в потоке..
                                      как!? не хватает опыта . нужен какой то пример и подсказка
                                        Цитата Emmys @
                                        в частности не понимаю как обрабатывать в потоке IdUDPServer1UDPRead
                                        т.е. что бы все работало верно - запускаю 20 серверов с разными настройками - каждый что бы имел свою обработку IdUDPServer1UDPRead и реализовать её в потоке..
                                        как!? не хватает опыта . нужен какой то пример и подсказка

                                        Плохо понимаю вопросы...я делал так:
                                        1. создаём Эвент. Будем использовать его для выхода из потока при завершении приложения.
                                        Эвент будет взводиться из главного потока приложения при завершении работы.
                                        Например из WM_CLOSE или WM_DESTROY.
                                        Поток будет существовать всё время, пока существует приложение.
                                        2. создаю поток. В потоке:
                                        3. Создаём сокет.
                                        4. Делаем Bind

                                        Начало цикла:
                                        5. Используем select, для получения статуса сокета и последующего его чтения.
                                        select работает с T-OUT-ом.
                                        Либо будет информация о принятых данных, либо информация об ошибке, либо T-OUT.
                                        6. Если приняли данные, то используем их по назначению.
                                        Если ошибка - обрабатываем её.
                                        Проверяем эвент на готовность.
                                        Если TOUT, только проверяем эвент на готовность.
                                        Если взведён - зачищаем ресурсы,выходим из потока.
                                        Иначе - возвращаемся к пункту 5.
                                        Сообщение отредактировано: ЫукпШ -
                                          ЫукпШ, вы понятно говорите. я это вроде как понимаю - как должно быть.

                                          но именно я не понимаю как это сделать с учетом что я хотел обрабатывать именно IdUDPServer1UDPRead в потоке.
                                          от компонента idUDPSServer

                                          пример надо
                                            Emmys, мне кажется ты пытаешься скрестить змею с колючей проволокой, ЫукпШ тебе говорит как это работает через обычные сокеты, которые беркли, а ты зачем-то пытаешься туда Indy впихнуть, которые как я понимаю либо уже работают через отдельный поток либо вообще асинхронные.... т.е. если тебе так нужен Indy, то лучше вообще без потока обойтись - просто в UDPRead лепишь конечный автомат под свои нужды.
                                              Step, по факту. есть приложение. пользователь задает задачи какие либо. каждое задание или несколько заданий в группе и для выполнения - запускается поток.
                                              так вот. хочу возможность добавить создать задачу - задание 1 - создать сервер с портом 50000, задание 2 - создать сервер с портом 50001 и так далее. тоесть динамически забиндить определенное количество портов. и что бы каждый сам забиндиный сервер принимал отдельно данные пришедшие на его конкретный порт. т.е. динамическое создание и уничтожение idUDPSErver в потоке с обработкой пришедших данных
                                              мне кажется так можно. но просто знаний не хватет
                                                ну ок. сделал топорно вынеся это в отдельный процесс который запускается с параметром....
                                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                0 пользователей:


                                                Рейтинг@Mail.ru
                                                [ Script execution time: 0.0947 ]   [ 15 queries used ]   [ Generated: 25.08.26, 14:56 GMT ]