Протокол межсетевых управляющих сообщений для IP6
#include <sys/socket.h>#include <netinet/in.h>#include <netinet/icmp6.h>int socket( AF_INET6,SOCK_RAW,proto );
ICMP6 - это протокол сообщений об ошибках и управляющих сообщений, используемый IP6 и семейством интернет-протоколов. Доступ к нему можно получить через «сырой сокет» для функций мониторинга и диагностики сети. Используйте функцию getprotobyname(), чтобы получить параметр proto для функции socket(), или просто передайте IPPROTO_ICMPV6
.
ICMPv6 сокеты не требуют установления соединения. Предполагается использование ICMP сокетов, которые не требуют установления соединения, с sendto() и recvfrom(), хотя также можно использовать и connect() для исправления назначения будущих пакетов (в этом случае можно использовать системные вызовы read() или recv(), и write() или send()).
К исходящим пакетам автоматически в начало добавляется IP заголовок, основанный на адресе назначения. Поле контрольной суммы псевдозаголовка ICMP6 (icmp6_cksum, находится в структуре icmp6_hdr в <netinet/icmp6.h>
) автоматически заполняется менеджером сокетов. Входящие пакеты принимаются без заголовка IP6 или расширенных заголовков.
Данное поведение отличается как от сырых сокетов IPv4, так и от сокетов ICMPv4. |
Фильтр тип/код ICMP6
Каждый сырой сокет ICMP6 имеет связанный фильтр, тип данных которого определен как struct icmp6_filter
. Эта структура, а также макросы и константы, определенные ниже, определены в заголовке <netinet/icmp6.h>
.
Можно получить и установить текущий фильтр, вызвав getsockopt() и setsockopt() с уровнем IPPROTO_ICMPV6
и ICMP6_FILTER
.
Следующие макросы работают со структурой icmp6_filter
. Если первый аргумент является целым числом, он представляет тип сообщения ICMP6 со значением от 0
до 255
. Аргументы указателя - это указатели на фильтры, которые либо устанавливаются, либо проверяются, в зависимости от макроса:
При создании сырого сокета ICMP6, он по умолчанию передает в приложение все типы сообщений ICMPv6.
Для получения более детальной информации, обратитесь к RFC 2292.
connect(), getprotobyname(), getsockopt(), read(), recv(), recvfrom(), send(), sendto(), setsockopt(), socket(), write()
Основано на RFC 2292
Предыдущий раздел: Описание API сетевой библиотеки