На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Пример простейшего сниффера для W2K/XP , ошибка 10022
      В общем скомпилил пример из http://www.sources.ru/cpp/network/sniff_2k_xp.shtml
      но вылетает в ошибку 10022 :(
      Прикреплённый файлПрикреплённый файлTrafik.zip (6.54 Кбайт, скачиваний: 180)
        Либо не создается сокет либо он не привязывется к локальному адресу.
        Чуток подправил код проверь его
        и на будующее проверяй что возвращяют функции
        ExpandedWrap disabled
          int _tmain(int argc, _TCHAR* argv[])
          {
              WSADATA     wsadata;   // Инициализация WinSock.
              SOCKET      s;         // Cлущающий сокет.
              char        name[128]; // Имя хоста (компьютера).
              HOSTENT*    phe;       // Информация о хосте.
              SOCKADDR_IN sa;        // Адрес хоста
              IN_ADDR sa1;        //
              unsigned long        flag = 1;  // Флаг PROMISC Вкл/выкл.
           
              // инициализация
              WSAStartup(MAKEWORD(2,2), &wsadata);
              s = socket( AF_INET, SOCK_RAW, IPPROTO_IP );
              if(s == INVALID_SOCKET)
              {
                  sprintf( Buffer, "Oшибка: %d", WSAGetLastError() );
                  MessageBox( NULL, Buffer, "Ошибка", MB_ICONSTOP);
                  return 1;
              }
           
              if(gethostname(name, sizeof(name)) == SOCKET_ERROR)
              {
                  sprintf( Buffer, "Oшибка: %d", WSAGetLastError() );
                  MessageBox( NULL, Buffer, "Ошибка", MB_ICONSTOP);
                  return 2;
              }
              phe = gethostbyname( name );
              if(!phe)
              {
                  sprintf( Buffer, "Oшибка: %d", WSAGetLastError() );
                  MessageBox( NULL, Buffer, "Ошибка", MB_ICONSTOP);
                  return 3;
              }
              ZeroMemory( &sa, sizeof(sa) );
              sa.sin_family = AF_INET;
              sa.sin_addr.s_addr = ((struct in_addr *)phe->h_addr_list[0])->s_addr;
              if(bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR)) == SOCKET_ERROR)
              {
                  sprintf( Buffer, "Oшибка: %d", WSAGetLastError() );
                  MessageBox( NULL, Buffer, "Ошибка", MB_ICONSTOP);
                  return 4;
              }
           
              // Включение promiscuous mode.
              if( ioctlsocket(s, SIO_RCVALL, &flag) == SOCKET_ERROR ){
                  sprintf( Buffer, "Oшибка: %d", WSAGetLastError() );
                  MessageBox( NULL, Buffer, "Ошибка", MB_ICONSTOP);
              }
              else
              // Бесконечный цикл приёма IP-пакетов.
              while( !_kbhit() ) {
                  int count;
                  count = recv( s, Buffer, sizeof(Buffer), 0 );
           
                  // обработка IP-пакета
                  if( count >= sizeof(IPHeader) ) {
                      IPHeader* hdr = (IPHeader *)Buffer;
                      //Начинаем разбор пакета...
           
                      strcpy(src,"Пакет: ");
                      CharToOem(src,dest);
                      printf(dest);
                      // Преобразуем в понятный вид адрес отправителя.
                      printf("From ");
                      sa1.s_addr = hdr->iph_src;
                      printf(inet_ntoa(sa1));
           
                      // Преобразуем в понятный вид адрес получателя.
                      printf(" To ");
                      sa1.s_addr = hdr->iph_dest;
                      printf(inet_ntoa(sa1));
           
                      // Вычисляем протокол. Полный список этих констант
                      // содержится в файле winsock2.h
                      printf(" Prot: ");
                      if(hdr->iph_protocol == IPPROTO_TCP) printf("TCP ");
                      if(hdr->iph_protocol == IPPROTO_UDP) printf("UDP ");
           
                      // Вычисляем размер. Так как в сети принят прямой порядок
                      // байтов, а не обратный, то прийдётся поменять байты местами.
                      printf("Size: ");
                      lowbyte = hdr->iph_length>>8;
                      hibyte = hdr->iph_length<<8;
                      hibyte = hibyte + lowbyte;
                      printf("%d", hibyte);
           
                      // Вычисляем время жизни пакета.
                      printf(" TTL:%d",hdr->iph_ttl);
                      printf("\n");
           
                  }
              }
           
              closesocket( s );
              WSACleanup();
           
              return 0;
          }
          Я оставил проверку там где появлялась ошибка.
          Проверил, твой и "мой" вариант работают когда есть подключение к интернет.
          А вот если пробовать отлаживать запустив Аппач, то тогда ошибку выдает!
          Странно как-то...
            у меня с 1 кодам не работает с 2 все замечательно работает, ищи проблемы у себя...
              в MSDN ищем Windows Sockets Error Codes
              и смотрим тама:
              Цитата

              WSAEINVAL
              10022
              Invalid argument.
              Some invalid argument was supplied (for example, specifying an invalid level to the setsockopt function). In some instances, it also refers to the current state of the socket—for instance, calling accept on a socket that is not listening.
                А как узнать момент подключения к интернету?
                Т.е. чтобы не пропустить начало обмена пакетами, ну и естественно винду не тормозить (прога будет висеть в трее)?
                  Цитата Vladimir_ @
                  А как узнать момент подключения к интернету?
                  Т.е. чтобы не пропустить начало обмена пакетами, ну и естественно винду не тормозить (прога будет висеть в трее)?

                  юзайте WMI (если ось не критична - от висты и выше)
                  если критично..то подходит NDIS интерфейс и сетевые таблицы через апи..

                  удачи Вам
                  (круглый)
                    Цитата kolobok0 @
                    ...от висты и выше

                    я бы попрапил win2000
                      А как узнать потеряно ли FTP-соединение?

                      И еще вопрос. А как изменить конкретный атрибут, например имеем:
                      -rw-r--r--
                      на
                      -rwxr--r--
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0275 ]   [ 16 queries used ]   [ Generated: 10.12.24, 12:30 GMT ]