На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Почему вызов ioctlsocket происходит с ошибкой
      Программа выполняется на компьютере под управлением Windows11версии 21H2
      отладку произвожу в Студии 2022
      В главной процедуре
      u_long flag = 1;
      #define SIO_RCVALL 0x98000001
      вызов функции
      ioctlsocket(mysocket, SIO_RCVALL , &flag);
      if (iResult != NO_ERROR)
      {
      printf("ioctlsocket failed with error: %ld\n", iResult);
      };
      Вызов последней процедуры приводит к выводу сообщения ioctlsocket failed with error: -1
      В чем проблема? Что нужно мне сделать чтобы программа работала корректно?
      Сообщение отредактировано: izumov -
        Цитата izumov @
        Что нужно мне сделать чтобы программа работала корректно?

        :crazy: ChatGPT рекомендуэ:

        Цитата
        Проблема заключается в значении переменной iResult, которая содержит ошибку при вызове функции ioctlsocket. В данном случае, значение -1 указывает на возникновение ошибки. Чтобы устранить проблему, вам следует выполнить следующие действия:
        • Убедитесь, что библиотека <winsock2.h> подключена в вашем коде. Она необходима для работы с сокетами и вызова функции ioctlsocket. Убедитесь также, что вы используете правильные версии библиотеки и компилятора для вашей версии Windows и Студии.
        • Проверьте, что переменная mysocket содержит действительный сокет, полученный из предыдущих действий вашей программы. Возможно, ошибка возникает из-за неверного или недействительного сокета.
        • Убедитесь, что правильно установлен флаг SIO_RCVALL. В данном случае, значение 0x98000001 должно быть правильным для вашей операционной системы и среды разработки. Если возникнут сомнения, обратитесь к документации по функции ioctlsocket и флагу SIO_RCVALL для проверки правильного значения.
        • Проверьте, что у вас достаточные права доступа для работы с сокетами и вызовом функции ioctlsocket. Некоторые операционные системы и настройки безопасности могут потребовать административных привилегий или специальных разрешений для использования сокетов.
        При вызове функции ioctlsocket в вашем коде возникает ошибка с кодом -1. Для выяснения причины ошибки, рекомендуется проверить значение переменной errno, которая содержит информацию о последней ошибке операционной системы. Вы можете добавить следующий код после вызова ioctlsocket для вывода информации об ошибке:

        ExpandedWrap disabled
          if (iResult != NO_ERROR)
          {
              printf("ioctlsocket failed with error: %ld\n", iResult);
              printf("Error code: %d\n", errno);
          }

        Это позволит вам получить больше информации о причине ошибки. Например, значения WSAEINVAL или WSAEOPNOTSUPP могут указывать на неправильные параметры или несовместимость операции с выбранным сокетом или флагом.
        Проверьте значение errno и обратитесь к соответствующей документации или похожим проблемам, чтобы определить, как исправить ошибку и добиться корректной работы вашей программы.
          Благодарю за подсказку программа выдала Error code: 0

          Добавлено
          Пока не могу найти расшифровку что обозначает Error code: 0
          Подскажите если кто знает
            mysocket - валидный, до вызова ioctlsocket проверял его?

            Привел бы здесь весь свой код ...
              Его инициализация проходит успешно WinSock initialization is OK
                0x98000001 = SIO_RCVALL
                Включает получение всех сетевых IPv4-пакетов.
                У сокета должно быть семейство адресов InterNetwork, типом сокета должен быть Raw, а типом протокола должен быть IP. Текущий пользователь должен быть участником группы администраторов, а сокет должен принадлежать определенному порту. Для получения кода ошибки в виде строки сообщения, используйте WSAGetLastError() + FormatMessage().
                  я немного скоррекировал код
                  ExpandedWrap disabled
                    if (iResult != NO_ERROR)
                         {
                            printf("mysocket handler: %ld\n", long(mysocket));//чтобы убедиться что дескриптор сокета перед вызовом функции действительный
                            printf("ioctlsocket failed with error: %ld\n", iResult);
                            printf("Error code: %d\n",WSAGetLastError() );

                  Теперь программа выводит
                  mysocket handler: 224
                  ioctlsocket failed with error: -1
                  Error code: 10022
                  Что обозначает код ошибки 10022?и где можно посмотреть расшифровку кодов ошибок?
                  Сообщение отредактировано: izumov -
                    Соме аргумент из инвалид
                      Для полноты картины привожу параметры инициализации сокета , где 5000-порт,adr="127.0.0.1"-IP адрес
                      ExpandedWrap disabled
                        MySocket Socket1 = MySocket(AF_INET, SOCK_RAW, 5000, IPPROTO_IP, adr);

                      Код ошибки означает
                      Недействительным аргумент.
                      Был предоставлен недопустимый аргумент (например, указан недопустимый уровень для функции setsockopt ). В некоторых случаях это также относится к текущему состоянию сокета — например, вызов accept для сокета, который не прослушивается.

                      Но я никак не пойму как это относится к моему коду. Какой параметр не нравится функции.
                          Цитата izumov @
                          Но я никак не пойму как это относится к моему коду. Какой параметр не нравится функции.

                          Да вы вообще неправильно понимаете работу с сокетами..
                          Последовательность функций должна быть такая:

                          1. WSAStartup() - подключиться к провайдеру MSAFD,
                          2. gethostname() - имя нашего узла,
                          3. gethostbyname() - наш IP,
                          4. Заполняем структуру "sockaddr_in": addr.sin_addr=наш IP, addr.sin_port=0 (произвольный), addr.sin_family=AF_INET.
                          5. sc = socket, AF_INET, SOCK_RAW, IPPROTO_IP - создаём сокет,
                          6. sa = bind, sc, &addr, 16 - привязываем к сокету адрес из структуры "addr = sockaddr_in",
                          7. ioctlsocket, sc, SIO_RCVALL, &flag - пробуем вкл. режим Promisc сетевой карты!
                          8. recv, sс, &buff, 512, 0 - цикл приёма пакетов..
                          Сообщение отредактировано: core-i7 -
                            Так вот параметр SIO_RCVALL и не нравится функции при его замене на FIONBIO функция завершается без ошибки. То есть перевод в неблокирующий режим производится без проблем а вот перевести сокет в неразборчивый режим что то мешает( :wall:
                            Сообщение отредактировано: izumov -
                              Цитата izumov @
                              а вот перевести сокет в неразборчивый режим что то мешает

                              Какая у вас система?
                              К примеру у меня 64-битная Win7, и RAW-сокет создаётся без проблем (пишу на ассме).
                              Вот лог приёма пакетов..

                              Прикреплённая картинка
                              Прикреплённая картинка


                              Добавлено
                              сори, не заметил в первом сообщении.. Win-11.
                              можно запросить поддержку сырых сокетов провайдером Win - может на уровне системы они убиты?
                              для этого, в ком.строке вводим "netsh" и передаём утилите запрос "winsock show catalog"
                              теперь смотрим, имеется или нет с списке поставщик RAW. У меня это выглядит так.. т.е. поддержка осью есть:

                              ExpandedWrap disabled
                                C:\> netsh
                                netsh> winsock show catalog
                                 
                                Элемент поставщика каталога Winsock
                                ------------------------------------
                                Описание:                 MSAFD Tcpip [TCP/IP]
                                Путь поставщика:          %SystemRoot%\system32\mswsock.dll
                                Версия:                   2     ; WinSock v2.0
                                Тип адреса:               2     ; AF_INET
                                Наибольшая длина адреса:  16    ; размер структуры "sockaddr_in"
                                Тип сокета:               1     ; SOCK_STREAM (tcp, потоковый)
                                Протокол:                 6     ; IPPROTO_TCP
                                 
                                Элемент поставщика каталога Winsock
                                ------------------------------------
                                Описание:                 MSAFD Tcpip [UDP/IP]
                                Путь поставщика:          %SystemRoot%\system32\mswsock.dll
                                Версия:                   2
                                Тип адреса:               2
                                Наибольшая длина адреса:  16
                                Тип сокета:               2     ; SOCK_DGRAM (udp, дейтаграммы)
                                Протокол:                 17    ; IPPROTO_UDP
                                 
                                Элемент поставщика каталога Winsock
                                ------------------------------------
                                Описание:                 MSAFD Tcpip [RAW/IP]
                                Путь поставщика:          %SystemRoot%\system32\mswsock.dll
                                Версия:                   2
                                Тип адреса:               2
                                Наибольшая длина адреса:  16
                                Тип сокета:               3     ; SOCK_RAW (сырой)
                                Протокол:                 0     ; IPPROTO_IP
                                 
                                Элемент поставщика каталога Winsock
                                ------------------------------------
                                Описание:                 MSAFD Tcpip [TCP/IPv6]
                                Путь поставщика:          %SystemRoot%\system32\mswsock.dll
                                Версия:                   2
                                Тип адреса:               23    ; AF_INET6
                                Наибольшая длина адреса:  28    ; размер структуры "sockaddr_in"
                                Тип сокета:               1     ; SOCK_STREAM (tcp, потоковый)
                                Протокол:                 6     ; IPPROTO_TCP
                                 
                                Элемент поставщика каталога Winsock
                                ------------------------------------
                                Описание:                 MSAFD Tcpip [UDP/IPv6]
                                Путь поставщика:          %SystemRoot%\system32\mswsock.dll
                                Версия:                   2
                                Тип адреса:               23
                                Наибольшая длина адреса:  28
                                Тип сокета:               2
                                Протокол:                 17
                                 
                                Элемент поставщика каталога Winsock
                                ------------------------------------
                                Описание:                 MSAFD Tcpip [RAW/IPv6]
                                Путь поставщика:          %SystemRoot%\system32\mswsock.dll
                                Версия:                   2
                                Тип адреса:               23
                                Наибольшая длина адреса:  28
                                Тип сокета:               3
                                Протокол:                 0
                                 
                                Элемент поставщика каталога Winsock
                                ------------------------------------
                                Описание:                 Поставщик услуг RSVP TCPv6
                                Путь поставщика:          %SystemRoot%\system32\mswsock.dll
                                Версия:                   2
                                Тип адреса:               23
                                Наибольшая длина адреса:  28
                                Тип сокета:               1
                                Протокол:                 6
                                 
                                Элемент поставщика каталога Winsock
                                ------------------------------------
                                Описание:                 Поставщик услуг RSVP TCP
                                Путь поставщика:          %SystemRoot%\system32\mswsock.dll
                                Версия:                   2
                                Тип адреса:               2
                                Наибольшая длина адреса:  16
                                Тип сокета:               1
                                Протокол:                 6
                                Сделал как вы сказали у меня такой вывод
                                Прикреплённая картинка
                                Прикреплённая картинка

                                Прикреплённая картинка
                                Прикреплённая картинка

                                Прикреплённая картинка
                                Прикреплённая картинка

                                Прикреплённая картинка
                                Прикреплённая картинка
                                  В ваших логах нет нужной инфы, а маячит только сокет "Hyper-V RAW",
                                  который использует системный гипервизор для общения с сетью вирт.машин типа VMware.
                                  Вот что означают эти данные:

                                  ExpandedWrap disabled
                                    Элемент поставщика каталога Winsock
                                    ------------------------------------
                                    Описание:                 Hyper-V RAW
                                    Путь поставщика:          %SystemRoot%\system32\mswsock.dll
                                     
                                    Версия:                   2     ; WinSock v2.0
                                    Тип адреса:               34    ; AF_HYPERV
                                    Наибольшая длина адреса:  36    ; размер структуры "sockaddr_in"
                                    Тип сокета:               1     ; SOCK_STREAM  (tcp)
                                    Протокол:                 1     ; HVPROTO_RAW

                                  Нужно было прокрутить лог ниже и найти "Описание: TCP/IP RAW". Если он имеется в списке, то дальше зависит от того, какой адрес вы привязали к сокету - IPv4, или IPv6. Для первого случая размер структуры "sockaddr_in" должен быть 16-байт, а для IPv6 размер = 28-байт. То-есть формат структур у них разный. Судя по сообщению(#9) вы юзаете IРv4. Чекнуть структуру на валидность можно отладочной мессагой:

                                  ExpandedWrap disabled
                                    printf("sockaddr_in size: %d\n", sizeof.sockaddr_in)

                                  Другими словами, если поставщик Winsock поддерживает "TCP/IP RAW", то проблема у вас только с передачей адреса в bind(). Cкиньте сюда весь свой код, я его скомпилирую и проверю на своей Win7 х64.
                                  Сообщение отредактировано: core-i7 -
                                    Ларчик просто открывался.Как только я научился проводить отладку кода в dll. Я увидел что до вызова ioctlsjcket у меня сокет не привязывается к IP адресу
                                    вызов то функции привязки bind производился,но он завершался с ошибкой как только мне удалось устранить эту ошибку и сокет был корректно привязан к IP адресу
                                    так сразу же и вызов ioctlsocket завершился успешно и сокет был переведен в неразборчивый режим. :victory:
                                      Цитата izumov @
                                      как только мне удалось устранить эту ошибку

                                      А огласить всем "эту ошибку" религия не позволяет что-ли?
                                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                      0 пользователей:


                                      Рейтинг@Mail.ru
                                      [ Script execution time: 0,0544 ]   [ 20 queries used ]   [ Generated: 5.11.24, 09:41 GMT ]