我们先把在ping代码中的需要的知识学习下,然后我们在阅读代码部分只需要把流程讲清楚就可以了。
网络程序之间的连接需要五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。
结合上篇中的流程图,把用到的api介绍下。
icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);用来建立一个新的socket,也就是向系统注册,通知系统建立一通信端口。
1.domain协议族
AF_INET:等同于PF_INET,(Internet协议族,也就是TCP/IP)
2.type
SOCK_STREAM:流式套接字,面向连接和可靠的通信类型
SOCK_DGRAM:数据套接字,非面向连接和不可靠的通信类型
SOCK_RAW:原始套接字,用来直接访问IP协议
3. IPPROTO_ICMP
这里指定了通信协议,我们可以通过返回值套接字号可进行下一步操作。
bind(icmp_sock, (struct sockaddr*)&source, sizeof(source))
将套接口和机器上一定的端口号绑定在一起.包括了本机地址和本地端口地址。
struct sockaddr_in{ short sin_family; /*AF_INET*/ u_short sin_port; /*16位端口号,网络字节顺序*/ struct in_addr sin_addr; /*32位IP地址,网络字节顺序*/ char sin_zero[8]; /*保留*/ }
serv_addr是包含远端主机IP地址和端口号的指针;
用来接收远程主机经指定的socket传来的数据。参数s为已建立好连线的socket,如果利用UDP协议则不需经过连线操作。参数msg指向欲连线的数据结构内容,参数flags一般设0
主要的函数只有这几个。