一.套接字
int socket(int domain,int type,int protocol);
参数domain确定通信特性,它有4个域分别为
AF_INET IPV4英特网域
AF_INET6 IPV6因特网域
AF_UNIX UNIX 域
AF_UPSPEC 未指定
参数 type 确定套接字类型,进一步确定通信特性
SOCK_DGRAW 固定长度、无连接、不可靠的包文传递
SOCK_RAW IP 协议数据接口
SOCK_SEQPACKET 固定长度的、有序的、可靠的、面向连接的报文传递
SOCK_STREAM 有序的、可靠、双向的、面向连接的字节流
参数 protocol 通常是0,表示为给定的域和套接字选择默认
协议。AF_INT域SOCK_STREAM默认为传输控制协议 TCP,
AF_INT域套接字类型 SOCK_DGRAM 的默认协议是 UDP。
下面为英特网套接字定义的协议:
IPPROTO_IP, IPPROTO_IPV6, IPPROTO_ICMP
IPPROTO_RAW, IPPROTO_TCP, IPPROTO_UDP
返回值为套接字描述符,本质为一个文化描述符
SOCK_RAW和IPPROTO_ICMP
SOCK_RAW套接字提供一个数据报接口,用于直接访问下面的网络层
因为其绕过了传输协议(如 TCP和 UDP),所以我们必须自己构造
协议头部。注意当我们创建这个套接字的时候我们必须有超级用
户特权。因此实现 Ping 我们先来定义 ICMP 头部
struct ICMPHEAD{
u_int8_t type;
u_int8_t code;
u_int16_t checkSum;