原始套接字

定义原始套接字的目的在于提供访问某个协议的接口, 通过原始套接字, 进程可以读写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首部和所有扩展首部的净荷

posted @ 2018-11-14 23:13  不想取名字所以就随便写了  阅读(197)  评论(0编辑  收藏  举报