Chinaunix首页 | 论坛 | 博客
  • 博客访问: 450917
  • 博文数量: 64
  • 博客积分: 3271
  • 博客等级: 中校
  • 技术积分: 727
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-30 18:42
文章分类

全部博文(64)

文章存档

2013年(1)

2011年(19)

2010年(42)

2009年(2)

分类: LINUX

2010-07-24 16:14:00

看unp,利用上面的ping程序,顺便实现了AF_PACKET的一个ping程序。

代码

struct icmp *icmp;
  7 struct iphdr *ip;
  8 struct sockaddr_in *me, *he;
  9 he = (void *)pr->sasend;
 10
 11 ip = (struct iphdr *)sendbuf;
 12 memset(ip, 0, 20);
 13 static int ttl = 10;
 14 ip->ttl = ttl;
 15 ip->saddr = saddr;
 16 ip->daddr = he->sin_addr.s_addr;//inet_addr("192.168.1.12");

 17 ip->protocol = IPPROTO_ICMP ;
 18 ip->tot_len = htons(sizeof(*ip) + datalen + 8 ); //ip头部+icmp payload+icmp header

 19 ip->ihl = sizeof(*ip)/4 ;
 20 ip->id = 0;
 21 ip->frag_off = htons(IP_DF);
 22 ip->version = 4 ;
 23 ip->check = 0;
 24 ip->check = in_cksum((uint16_t *)ip, 20);
 25
 26 printf("%d\n", sizeof(struct icmp));
 27
 28 icmp = (struct icmp *)(ip + 1);
 29 icmp->icmp_type = ICMP_ECHO;
 30 icmp->icmp_code = 0;
 31 icmp->icmp_id = pid;
 32 icmp->icmp_seq = nsent++;
 33 memset(icmp->icmp_data, 0xa5, datalen);
 34 gettimeofday((struct timeval *)icmp->icmp_data, NULL);
 35
 36 len = 8 + datalen;  //payload + header
 37 icmp->icmp_cksum = 0;
 38 icmp->icmp_cksum = in_cksum((uint16_t *)icmp, len);
 39
 40 struct sockaddr_ll sll;
 41 static uint8_t dmac[]={0xff,0xff,0xff,0xff,0xff,0xff};  //链路上广播
 42 init_addr_ll(&sll, dmac);
 43 int i = sendto(sockfd, sendbuf, len + 20, 0, (void *)&sll, sizeof(sll) );
 44 if(i < 0)perror("sendto");


socket的创建:

sockfd = socket(AF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL));


报文接收
......待续
阅读(3951) | 评论(0) | 转发(0) |
0

上一篇:代码调试-预定义宏

下一篇:Sed学习笔记

给主人留下些什么吧!~~