На главную Наши проекты:
Журнал   ·   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 протоколом
    Здравствуйте, уважаемые форумчане!
    Недавно у меня возникла потребность в работе с UDP протоколом, но т.к. я нуб-самоучка, но погуглив несколько примеров, так и не понял, как с ним работать.
    Мне требуется передать определенный массив данных на сервер и получить от него ответ.
    К сожалению у меня ничего не вышло. Ниже код моих функций
    ExpandedWrap disabled
      type
        TPacket = packed record
          pack: array [1 .. 15] of byte;
        end;
       
      var
        Sock: TSocket;
        ServerAddr: TSockAddrIn;
        wData: TWSAData;
        fip:string;
      const
        port=7701;
       
      procedure SendToIP(fpack: string);
        procedure Send(var Packet: TPacket; var Addr: TSockAddrIn);
        begin
          sendto(Sock, Packet, 12, 0, Addr, SizeOf(Addr));
        end;
       
      var
        PacketToSend: TPacket;
        i: integer;
      const
        testpacket:array [1..12] of byte=($53, $41, $4D, $50, $B2, $DA,
                                          $D6, $4E, $15, $1E, $69, $53);
      begin
        ServerAddr.sin_port := htons(port);
        ServerAddr.sin_addr.S_addr := inet_addr(PAnsiChar(fip));
       // PacketToSend.pack := $00;
       FillChar(PacketToSend.pack,sizeof(PacketToSend.pack),0);
       { for i := 0 to length(fpack) - 1 do
          PacketToSend.pack[i] := Ord(fpack[i + 1]); }
        lstrcpy(@PacketToSend.pack, @testpacket);
       
        Send(PacketToSend, ServerAddr);
      end;
       
      procedure ExecutePacket(pack: TPacket; from: AnsiString);
      var
      i:integer;
      p:string;
      begin
      for i:=1 to sizeof(pack.pack) do begin
         p:=p+IntToHex(pack.pack[i],2)+' ';
         end;
        MessageBoxA(0,Pchar(p),PChar(from),0);
      end;
       
      procedure RecvProc(Param: Pointer); stdcall;
      var
        Count: LongInt;
        from: TSockAddrIn;
        FromLen: LongInt;
        Packet: TPacket;
        i, j: LongInt;
      begin
        while True do
        begin
          FromLen := SizeOf(from);
          Count := recvfrom(Sock, Packet, SizeOf(Packet), 0, from, FromLen);
      {    if Count > 0 then
          begin }
            ExecutePacket(Packet, string(inet_ntoa(from.sin_addr)));
          end;
       // end;
      end;
       
      procedure InitUDP;
      begin
        WSAStartup($0101, wData);
        Sock := socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
        ServerAddr.sin_family := AF_INET;
        ServerAddr.sin_port := htons(port);
        bind(Sock, ServerAddr, SizeOf(ServerAddr));
        CreateThread(nil, 0, @RecvProc, nil, 0, LongWord(nil^));
      end;
       
      procedure DestroyUDP;
      begin
        closesocket(Sock);
        WSACleanup;
      end;


    Проблема заключается в том, что при отправке ничего не происходит. Ответа не приходит(судя по всему и отправки тоже). Включив сниффер пакетов и запустив свое приложение, я не увидел, чтобы что либо отправлялось.
    Будьте любезны, покажите на пальцах работающий пример и объясните пожалуйста в чем у меня ошибки.
    Заранее огромное спасибо!
      BugMeNot
      Читайте:
      У. Р. Стивенс. UNIX. Разработка сетевых приложений
      Джонес_А.,_Оланд_Дж.-Программирование_в_сетях_Microsoft_Windows-Питер(2002)

      Читать в таком порядке.

      Добавлено
      PS. Каждая функция возвращает свой статус. Сделай проверку и вывод описания ошибки. Тогда можно будет легко понять что не работает.
        Pavia, надеюсь когда у вас возникнет вопрос в какой-либо сфере деятельности и вы обратитесь к специалисту, он порекомендует вам прочитать 800 страничную книгу, где описана схожая с вашей проблема.
          Цитата BugMeNot @
          но т.к. я нуб-самоучка, но погуглив несколько примеров, так и не понял, как с ним работать.

          Цитата BugMeNot @
          Pavia, надеюсь когда у вас возникнет вопрос в какой-либо сфере деятельности и вы обратитесь к специалисту, он порекомендует вам прочитать 800 страничную книгу, где описана схожая с вашей проблема.

          BugMeNot, в таком случае почему бы не обратиться к компоненту Indy? Который UDP? И не пытаться понять "внутренности" сокетов? :D Например так:
          ExpandedWrap disabled
            IdUDPServer1.SendBuffer(ax,9750,ay[1],2);
          ???
            1. Сделать простейший тестовый пример (отправка 1 байта / прием 1 байта) - без потоков и пакетов. Легче будет ловить глюки.
            2. В самом деле проверять результат всех сокет-функций. Это можно легко выполнить, обернув каждый вызов в Win32Check
              BugMeNot
              На лови пример накидал с проверочкой, ток не знаю зачем это тебе хочешь досер негодник написать ))):
              ExpandedWrap disabled
                var
                  Form1: TForm1;
                  s:TSocket;
                  WSA:TWSAData;
                  addr:TSockAddr;
                  Buff:array[0..1024] of Char;
                  th1: cardinal;
                  h1: integer;
                 
                implementation
                 
                {$R *.dfm}
                 
                procedure incedit1;
                begin
                Buff:=    '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+
                          '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+
                          '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+
                          '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+
                          '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+
                          '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+
                          '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+
                          '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+
                          '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+
                          '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+
                          '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+
                          '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+
                          '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+
                          '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+
                          '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+
                          '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+
                          '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10;
                 
                while 0=0 do
                begin
                send(s,Buff,Length(Buff),0);
                Form1.Memo1.Lines.Add(IntToStr(s)); //проверяем идёт ли отправка наших пакетов
                Sleep(1);
                end;
                end;
                 
                procedure TForm1.Button1Click(Sender: TObject);
                begin
                WSAStartup(MakeWord(2, 0), WSA);
                s := Socket(PF_INET, SOCK_STREAM, 0);
                addr.sin_family := AF_INET;
                addr.sin_port := htons(80);
                addr.sin_addr.S_addr := inet_addr(PChar('80.247.32.206'));
                if connect(s, Addr, SizeOf(Addr))= 0 then
                Form1.Caption:='Connect' else Form1.Caption:='No Connect'; //проверяем законектились или нет, чтоб на указанный IP послать пакеты
                end;
                 
                procedure TForm1.Button2Click(Sender: TObject);
                begin
                  h1 := beginthread(nil, 1024, @incedit1, nil, 0, th1); //чтоб форма не висла запускаем в патоке incedit1
                end;
                 
                end.
                Не увидел, чему именно равно fip.
                Цитата BugMeNot @
                Включив сниффер пакетов и запустив свое приложение, я не увидел, чтобы что либо отправлялось.

                Если пересылка идёт самому себе (между разными портами одного и того же адаптера), то сниффер такой локальный трафик просто не слышит (даже такой хардкорный как WireShark) - но тут можно воткнуть две сетевые карты и соединить их кроссовер-кабелем (или через хаб/маршрутизатор и т.п.).
                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0.0750 ]   [ 15 queries used ]   [ Generated: 22.09.26, 13:05 GMT ]