原始套接字
Posted bzaq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原始套接字相关的知识,希望对你有一定的参考价值。
定义原始套接字的目的在于提供访问某个协议的接口, 通过原始套接字, 进程可以读写ICMPv4, IGMPv4和ICMPv6等分组, 进程也可以读写内核不处理其协议字段的IPv4数据报, 进程还可以使用IP_HDRINCL套接字选项自行构造IPv4首部。
创建一个原始套接字步骤如下:
int sockfd = socket(AF_INET, SOCK_RAW, protocol) 或者
int sockfd = socket(AF_INET6, SOCK_RAW, protocol)
其中protocol 通常不为0, 比如在ping程序中, protocol指定为IPPROTO_ICMP或IPPROTO_ICMPV6。
值得注意的是, 通过IPv6原始套接字发送和接收的协议首部中的所有字段均采用网络字节序, 另外通过IPv6原始套接字无法读入或写出完整的IPv6分组, 包括IPv6首部或任何扩展首部, 如果应用进程需要读入或者写出完整的IPv6数据报, 那就必须使用数据链路访问。
无论何时, 往一个原始IPv4套接字递送一个接收到的数据报, 传递到该套接字所在进程的都是包括IP首部在内的完整数据报, 而对于IPv6套接字, 传递到套接字的只是扣除了IPv6首部和所有扩展首部的净荷
以上是关于原始套接字的主要内容,如果未能解决你的问题,请参考以下文章