icmp:差错和控制信息的传输及某些网络信息的获取,允许路由器或主机报告差错情况和提供有关的异常报告。
看看ping程序:
1.套接字:
struct protoent * protocol;
protocol = getprotobyname("icmp");
int sockfd = socket(AF_INET, SOCK_RAW, protocol->p_proto)
2.设置超时限制:
int timeout = 1000;
setsockopt(png.sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *) & timeout, sizeof(timeout));
3.目的ip地址的获取:
struct hostent * host;
char *par_host; //主机名
struct sockaddr_in dest_addr;
host = gethostbyname(par_host);
memcpy((char *)&dest_addr.sin_addr, host->h_addr, host->h_length);
将ip地址存放在结构dest_addr中。
4.发送icmp包包含内容:
icmp_type = ICMP_ECHO; //询问报文,
cmp_code = 0; //echo回送请求
icmp_cksum = 0; //
icmp_seq = pack_no; //序号
icmp_id = png.pid; //标志,进程的id
icmp->icmp_data= GetTickCount(); //发送的数据,注意设置的数据长度。
整个报文的检验和:
按16位反码相加,然后取反。注:进位要相加到低位
5.接收到的报文:
IP头+ICMP头+数据;
其中
IP同包含应答主机的ip,
ICMP头的cmp_code = 8; //echo回送应答
数据部分为前面发送的icmp包。
6.
接收到的数据记录了发送的时间点。计算到接收时候的时间差就是往返时间。
阅读(743) | 评论(0) | 转发(0) |