На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (3) 1 [2] 3  все  ( Перейти к последнему сообщению )  
    > sendto , функция возвращает ошибки по непонятным причинам
      Цитата Columbo @
      Переписал exe-шники в одельную папку (до этого запускал просто из билдера): релиз, релиз с библиотеками, дебаг - все программы зависают на передаче.

      Стабильность ошибки позволяет надеяться на ее локализацию. :)
      Цитата Columbo @
      Причем тут броадкаст тоже не понятно, хотя я где то читал что для RAW сокетов эта опция нужна.

      Нет. Эта опция совершенно не нужна. Зачем?
        Columbo, попробуй так:
        ExpandedWrap disabled
          ...
          int err = bind(hSocket, (sockaddr*)&sockAddrHost, sizeof(sockAddrHost));
          ...
          Нашел где то в кодах такую идею:
          sendto(s, buf, sizeof(ICMP_HDR)+32, 0, (SOCKADDR *)&dest, sizeof(dest));
            Цитата Columbo @
            Вот метод класса:

            ну, господа туманные ежи..
            Мы работаем с raw sockets. Это автоматически обозначает, что мы должны формировать заголовок ip, потом все остальное

            ExpandedWrap disabled
              ipheader = (struct ip_header*)packet;
              icmp = (struct icmp_echo*)(packet+sizeof(struct ip_header));

            ну и далее,
            ExpandedWrap disabled
              ipheader->ver       = 4;    /*IPv4*/
              ipheader->hl        = 5;    /* This is the smallest possible value, our IP header is only 20 bytes */
              ipheader->tos       = 0;
              ipheader->totl      = sizeof(struct ip_header)+sizeof(struct icmp_echo);

            и понеслась по кочкам метла, в свою очередь,
            Цитата
            icmp->type = 8; /* icmp echo */
            icmp->code = 0; /* only valid value for echo or echo reply */
            icmp->identifier = 0x1337;
            icmp->sequence = ...

            ну и естественно, заполнить датой и посчитать чексумму, и будет полный порядок.
            Ро Сокет не знает в твоей ситуации, куда и что там нужно отправлять. Ты ему даешь охинею из байтов, от которой у винды несварение даты.
            Возьми нормальный базовый пример и исходя из него, строй приложение.

            Добавлено
            вот пример icmp под мелкософт если чо
            http://www.vijaymukhi.com/security/network/rawsockets.htm
            попробуй сначала собери консольную аппликацию под студией или своим древним как говно мамонта борландом, потом переходи к формам-кнопкам, иначе будешь неделю какать кирпичами и соберешь на форуме вокруг себя толпу телепатов (что уже сделано)
            Сообщение отредактировано: nemez -
              nemez а я думал ip заголовок формируется автоматически... Ну если это не так, почему все же удается посылать и принимать пакеты, ну за исключением описаных мною ситуаций, когда функция возвращает ошибку?

              Добавлено
              ЫукпШ, Oleg2004 не помогло..
              На другом компе фокус с биндингом и броадкастом не удался.. еще хуже стало - просто зависает программа.
              Сообщение отредактировано: Columbo -
                Цитата Columbo @
                ЫукпШ, Oleg2004 не помогло..
                На другом компе фокус с биндингом и броадкастом не удался.. еще хуже стало - просто зависает программа.

                Где-то выход за границы массива или портится стек. Или вместе.
                Это может быть где угодно в программе, а проявиться именно в этом месте.
                Легче начать другой проект сначала и по-проще - какой-нибудь консольный
                вариант исключительно для отладки класса.
                И двигаться мелкими шажками.
                  ЫукпШ Вот я убрал из прогаммы обновление Label->Caption, точнее даже не убрал а просто убрал пару строк оттуда и прекрасно обменивался пакетами без ошибок. И какова вероятность того что в консольном варианте, где нет ничего лишнего все будет работать? Я думаю 100%. Так куда двигаться в такой ситуации?
                  Попробую как рекомендует nemez сделать, только вот как можно на другой стороне принять мой пакет причем с анализом контрольной суммы и размер наверняка учитывается а айпи заголовке, если я его не формирую мне также не понятно... а он тем временем принимается без ошибок.
                  Сообщение отредактировано: Columbo -
                    Цитата Columbo @
                    nemez а я думал ip заголовок формируется автоматически...

                    Так оно и есть, если не применяется опция IP_HDRINCL. :yes:
                    А идеологически я согласен с ЫукпШ
                      Oleg2004 я уже понял
                        nemez я не нашел где формируется заголовок айпи в коде по твоей ссылке..
                        ExpandedWrap disabled
                          main(int argc, char **argv)
                           
                          {
                           
                          d = WSAStartup (MAKEWORD(2,1),&ws);
                           
                          printf("WSAStartup Return Value=%d\n",d);
                           
                          s = WSASocket(AF_INET,SOCK_RAW, IPPROTO_ICMP ,NULL, 0,0);
                           
                          printf("Socket Return Value=%d\n",s);
                           
                          hp = gethostbyname(argv[1]);
                           
                          memcpy(&dest.sin_addr,hp->h_addr,hp->h_length);
                           
                          dest.sin_family = hp->h_addrtype;
                           
                          printf("hp=%x Ip Address=%s\n",hp,inet_ntoa(dest.sin_addr));
                           
                          pIcmpHeader = (IcmpHeader *) malloc(sizeof(IcmpHeader));
                           
                          pIcmpHeader->i_type = 8;
                           
                          pIcmpHeader->i_code = 0;
                           
                          pIcmpHeader->i_id = (USHORT)GetCurrentProcessId();
                           
                          pIcmpHeader->i_cksum = 0;
                           
                          pIcmpHeader->i_seq = 326;
                           
                          memset(pIcmpHeader->data ,'A', 32);
                           
                          pIcmpHeader->timestamp = GetTickCount();
                           
                          pIcmpHeader->i_cksum = checksum((USHORT *)pIcmpHeader,sizeof(IcmpHeader));
                           
                          d = sendto(s,(char *)pIcmpHeader,sizeof(IcmpHeader),0,(struct sockaddr*)&dest,sizeof(dest));
                           
                          printf("Sentto return value=%d\n",d);
                           
                          dummy = sizeof(dest);
                           
                          d = recvfrom(s ,databuf,1024,0,(struct sockaddr*)&dest,&dummy);
                           
                          printf("recvfrom return value=%d\n",d);
                           
                          pIpHeader = (struct IpHeader *)databuf;
                           
                          printf("len=%x TOS=%d Total length %d %d\n",pIpHeader->lenver,pIpHeader->tos,pIpHeader->totallen , htons(pIpHeader->totallen));
                           
                          printf("ident=%d Frag=%d TTL=%d Protocol=%d\n",pIpHeader->ident,
                           
                          pIpHeader->fragandflags,pIpHeader->ttl,pIpHeader->proto);
                           
                          printf("CheckSum=%d %d\n",pIpHeader->checksum , checksum((USHORT *)databuf,20+32+12));
                           
                          printf("Source IP=%s Dest Ip=%s\n",inet_ntoa(pIpHeader->sourceIP),inet_ntoa(pIpHeader->destIP));
                           
                          printf("dest=%s\n",inet_ntoa(dest.sin_addr));
                           
                          int size = pIpHeader->lenver & 0x0f;
                           
                          size = size * 4;
                           
                          size = size - 20;
                           
                          printf("Size of IP headers %d\n",size);
                           
                          if ( size > 0)
                           
                          {
                           
                          struct ipopt *pipopt;
                           
                          pipopt = (struct ipopt *)(databuf + 20);
                           
                          printf("code=%d len=%d ptr=%d\n",pipopt->code,pipopt->len,pipopt->ptr);
                           
                          int noofstr;
                           
                          noofstr = (pipopt->ptr/4) - 1;
                           
                          printf("No of addr's=%d\n",noofstr);
                           
                          for ( i = 0 ; i < noofstr ; i++)
                           
                          {
                           
                          struct in_addr a;
                           
                          a.S_un.S_addr = pipopt->addr[i];
                           
                          printf("%s\n",inet_ntoa(a));
                           
                          }
                           
                          }
                           
                          }


                        структура заголовка заполняется уже после принятия пакета, это другая история, а перед отправкой - нет.
                        Сообщение отредактировано: Columbo -
                          Цитата Columbo @
                          ЫукпШ Вот я убрал из прогаммы обновление Label->Caption, точнее даже не убрал а просто убрал пару строк оттуда и прекрасно обменивался пакетами без ошибок.

                          Размеры программы изменились, возможно изменилось расположение кодов относительно данных.
                          По прежнему что-то портится, только в другом месте и в этой точке приложения не проявляется.
                            Цитата Columbo @
                            nemez я не нашел где формируется заголовок айпи в коде по твоей ссылке..

                            ExpandedWrap disabled
                              ipopt.code = 7;
                              ipopt.ptr  = 4;
                              ipopt.len  = 39;
                              setsockopt (s, IPPROTO_IP, IP_OPTIONS,(char *)&ipopt, sizeof(ipopt));
                              .....


                            вот тебе пдфочка
                            http://www.beknowledge.com/wp-content/uplo...2010/09/892.pdf
                            см. поиском функцию (<Ctrl-f>)
                            void DecodeIPOptions(char *buf, int bytes)
                            Через структуру (struct ipopt в том исходнике что ты смотрел) через setsockopt передаются параметры заголовка ip.

                            зы. Собери консольный пинг с примера рабочий, это тебе облегчит задачу
                              пошел собирать...
                                Предлагаю вместо
                                ExpandedWrap disabled
                                  unsigned char d = StrToInt(EditDataOut->Text);


                                ExpandedWrap disabled
                                  unsigned int d = StrToInt(EditDataOut->Text);
                                  Цитата Columbo @
                                  ExpandedWrap disabled
                                    //---------------------------------------------------------------------------
                                    void __fastcall TForm1::ButtonClick(TObject *Sender)
                                    {
                                     tICMP ICMP1;                        
                                     unsigned char DataOut[512];
                                     
                                    // unsigned char d = StrToInt(EditDataOut->Text);
                                     
                                     for (int i=0; i<100; i++)
                                        {
                                         DataOut[i] = 0x55;
                                    //     DataOut[i] = d;
                                        }
                                     
                                     AnsiString Res = ICMP1.SendData("192.168.1.1", DataOut, 100);
                                     if (Res != "OK")
                                        {
                                         ShowMessage(Res);
                                         return;
                                        }
                                    }
                                    //-----------------------------------------------------------------

                                  Что за говнокод?
                                  Сплошной хардкодинг.
                                  Это неприемлемо в коммерческом коде, отсюда ошибки.
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:
                                  Страницы: (3) 1 [2] 3  все


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0501 ]   [ 16 queries used ]   [ Generated: 18.04.24, 23:01 GMT ]