Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[34.204.176.71] |
|
Сообщ.
#1
,
|
|
|
Программа выполняется на компьютере под управлением 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 В чем проблема? Что нужно мне сделать чтобы программа работала корректно? |
Сообщ.
#2
,
|
|
|
Цитата izumov @ Что нужно мне сделать чтобы программа работала корректно? ChatGPT рекомендуэ: Цитата Проблема заключается в значении переменной iResult, которая содержит ошибку при вызове функции ioctlsocket. В данном случае, значение -1 указывает на возникновение ошибки. Чтобы устранить проблему, вам следует выполнить следующие действия: При вызове функции ioctlsocket в вашем коде возникает ошибка с кодом -1. Для выяснения причины ошибки, рекомендуется проверить значение переменной errno, которая содержит информацию о последней ошибке операционной системы. Вы можете добавить следующий код после вызова ioctlsocket для вывода информации об ошибке: if (iResult != NO_ERROR) { printf("ioctlsocket failed with error: %ld\n", iResult); printf("Error code: %d\n", errno); } Это позволит вам получить больше информации о причине ошибки. Например, значения WSAEINVAL или WSAEOPNOTSUPP могут указывать на неправильные параметры или несовместимость операции с выбранным сокетом или флагом. Проверьте значение errno и обратитесь к соответствующей документации или похожим проблемам, чтобы определить, как исправить ошибку и добиться корректной работы вашей программы. |
Сообщ.
#3
,
|
|
|
Благодарю за подсказку программа выдала Error code: 0
Добавлено Пока не могу найти расшифровку что обозначает Error code: 0 Подскажите если кто знает |
Сообщ.
#4
,
|
|
|
mysocket - валидный, до вызова ioctlsocket проверял его?
Привел бы здесь весь свой код ... |
Сообщ.
#5
,
|
|
|
Его инициализация проходит успешно WinSock initialization is OK
|
Сообщ.
#6
,
|
|
|
0x98000001 = SIO_RCVALL
Включает получение всех сетевых IPv4-пакетов. У сокета должно быть семейство адресов InterNetwork, типом сокета должен быть Raw, а типом протокола должен быть IP. Текущий пользователь должен быть участником группы администраторов, а сокет должен принадлежать определенному порту. Для получения кода ошибки в виде строки сообщения, используйте WSAGetLastError() + FormatMessage(). |
Сообщ.
#7
,
|
|
|
я немного скоррекировал код
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?и где можно посмотреть расшифровку кодов ошибок? |
Сообщ.
#8
,
|
|
|
Соме аргумент из инвалид
|
Сообщ.
#9
,
|
|
|
Для полноты картины привожу параметры инициализации сокета , где 5000-порт,adr="127.0.0.1"-IP адрес
MySocket Socket1 = MySocket(AF_INET, SOCK_RAW, 5000, IPPROTO_IP, adr); Код ошибки означает Недействительным аргумент. Был предоставлен недопустимый аргумент (например, указан недопустимый уровень для функции setsockopt ). В некоторых случаях это также относится к текущему состоянию сокета — например, вызов accept для сокета, который не прослушивается. Но я никак не пойму как это относится к моему коду. Какой параметр не нравится функции. |
Сообщ.
#11
,
|
|
|
Цитата 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 - цикл приёма пакетов.. |
Сообщ.
#12
,
|
|
|
Так вот параметр SIO_RCVALL и не нравится функции при его замене на FIONBIO функция завершается без ошибки. То есть перевод в неблокирующий режим производится без проблем а вот перевести сокет в неразборчивый режим что то мешает(
|
Сообщ.
#13
,
|
|
|
Цитата izumov @ а вот перевести сокет в неразборчивый режим что то мешает Какая у вас система? К примеру у меня 64-битная Win7, и RAW-сокет создаётся без проблем (пишу на ассме). Вот лог приёма пакетов.. Прикреплённая картинка
Добавлено сори, не заметил в первом сообщении.. Win-11. можно запросить поддержку сырых сокетов провайдером Win - может на уровне системы они убиты? для этого, в ком.строке вводим "netsh" и передаём утилите запрос "winsock show catalog" теперь смотрим, имеется или нет с списке поставщик RAW. У меня это выглядит так.. т.е. поддержка осью есть: 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 |
Сообщ.
#14
,
|
|
|
Сообщ.
#15
,
|
|
|
В ваших логах нет нужной инфы, а маячит только сокет "Hyper-V RAW",
который использует системный гипервизор для общения с сетью вирт.машин типа VMware. Вот что означают эти данные: Элемент поставщика каталога 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. Чекнуть структуру на валидность можно отладочной мессагой: printf("sockaddr_in size: %d\n", sizeof.sockaddr_in) Другими словами, если поставщик Winsock поддерживает "TCP/IP RAW", то проблема у вас только с передачей адреса в bind(). Cкиньте сюда весь свой код, я его скомпилирую и проверю на своей Win7 х64. |
Сообщ.
#16
,
|
|
|
Ларчик просто открывался.Как только я научился проводить отладку кода в dll. Я увидел что до вызова ioctlsjcket у меня сокет не привязывается к IP адресу
вызов то функции привязки bind производился,но он завершался с ошибкой как только мне удалось устранить эту ошибку и сокет был корректно привязан к IP адресу так сразу же и вызов ioctlsocket завершился успешно и сокет был переведен в неразборчивый режим. |
Сообщ.
#17
,
|
|
|
Цитата izumov @ как только мне удалось устранить эту ошибку А огласить всем "эту ошибку" религия не позволяет что-ли? |