在ICMP协议的应用中,我们使用Ping命令进行操作的任务也是比较多的。那么这里我们主要介绍的就是Linux下用ICMP实现简单的Ping功能。如果目的主机在工 输出在工状态 如果5妙内无相应 用SIGALRM信号中断进程。那么现在就让我们看看具体的Linux下用ICMP实现的Ping功能具体的代码进行一下介绍吧。
1。#include "unp。h"
2。void send_echo_req(int sockfd, struct sockaddr_in *dstaddr);
3。uint16_t in_cksum(uint16_t *addr, int len);
4。
void recv_echo_reply(int sockfd);
5。int main(int argc, char **argv)
6。{
7。int sockfd;
8。struct sockaddr_in dstaddr;
9。
if ((sockfd = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP)) == -1)
10。err_sys("socket");
11。bzero(&dstaddr, sizeof(dstaddr));
12。
dstaddr。sin_family = AF_INET;
13。dstaddr。sin_port = htons(0);
14。if (inet_pton(AF_INET, argv[1], &dstaddr。sin_addr) icmp_type = ICMP_ECHO;
29。
icmp->icmp_code = 0;
30。icmp->icmp_id = getpid();
31。icmp->icmp_seq = 1;
32。icmp->icmp_cksum = in_cksum((uint16_t *) icmp, sizeof(struct icmp));
33。
if (sendto(sockfd, buf, len, 0, (SA *)dstaddr, dstlen) == -1)
34。err_sys("sendto");
35。}
36。void recv_echo_reply(int sockfd)
37。
{
38。char buf[100];
39。ssize_t n;
40。struct ip *ip;。
全部