⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 udpipgen.c

📁 程序实现了Linux下dhcp客户端以及autoip客户端的功能
💻 C
字号:
#include <string.h>#include "udpipgen.h"unsigned short ip_id;unsigned short in_cksum(addr,len)unsigned short *addr;int len;{  register int sum = 0;  register u_short *w = addr;  register int nleft = len;  while (nleft > 1) {    sum += *w++;    nleft -= 2;  }  if (nleft == 1) {    u_char a = 0;    memcpy(&a,w,1);    sum += a;  }  sum = (sum >> 16) + (sum & 0xffff);  sum += (sum >> 16);  return ~sum;}void udpipgen(udpip,saddr,daddr,sport,dport,msglen)udpiphdr *udpip;unsigned int saddr,daddr;unsigned short sport,dport,msglen;{  struct ip ip_local;  struct ip *ip=&ip_local;  struct ipovly *io=(struct ipovly *)udpip->ip;  struct udphdr *udp=(struct udphdr *)udpip->udp;  io->ih_next = io->ih_prev = 0;  io->ih_x1 = 0;  io->ih_pr = IPPROTO_UDP;  io->ih_len = htons(msglen + sizeof(struct udphdr));  io->ih_src.s_addr = saddr;  io->ih_dst.s_addr = daddr;  udp->uh_sport = sport;  udp->uh_dport = dport;  udp->uh_ulen = io->ih_len;  udp->uh_sum = 0;  udp->uh_sum=in_cksum((unsigned short *)udpip,msglen+sizeof(udpiphdr));  if (udp->uh_sum == 0)     udp->uh_sum = 0xffff;  memcpy(ip,(struct ip *)udpip->ip,sizeof(ip_local));  ip->ip_hl = 5;  ip->ip_v = IPVERSION;  ip->ip_tos = 0;	/* normal service */  ip->ip_len = htons(msglen + sizeof(udpiphdr));  ip->ip_id = htons(ip_id); ip_id++;  ip->ip_off = 0;  ip->ip_ttl = IPDEFTTL; /* time to live, 64 by default */  ip->ip_p = IPPROTO_UDP;  ip->ip_src.s_addr = saddr;  ip->ip_dst.s_addr = daddr;#ifdef __GLIBC__  ip->ip_sum = 0;  memcpy(udpip->ip,ip,sizeof(ip_local));  ip->ip_sum = in_cksum((unsigned short *)&ip_local,sizeof(struct ip));#else  ip->ip_csum = 0;  memcpy(udpip->ip,ip,sizeof(ip_local));  ip->ip_csum = in_cksum((unsigned short *)&ip_local,sizeof(struct ip));#endif  memcpy(udpip->ip,ip,sizeof(ip_local));}int udpipchk(udpip)udpiphdr *udpip;{  int hl;  struct ip save_ip;  struct ip *ip=(struct ip *)udpip->ip;  struct ipovly *io=(struct ipovly *)udpip->ip;  struct udphdr *udp=(struct udphdr *)udpip->udp;  udpiphdr *nudpip = udpip;  hl = ip->ip_hl<<2;  if ( in_cksum((unsigned short *)udpip,hl) ) return -1;  memcpy(&save_ip, udpip->ip, sizeof(struct ip));  hl -= sizeof(struct ip);  /* thrash IP options */  if (hl) {     nudpip = (udpiphdr *)((char *)udpip+hl);    memmove((char *)nudpip,udpip,sizeof(struct ip));    io=(struct ipovly *)nudpip->ip;    ip=(struct ip *)nudpip->ip;    udp=(struct udphdr *)nudpip->udp;  }  if (udp->uh_sum == 0)     return 0;   io->ih_next = io->ih_prev = 0;  io->ih_x1 = 0;  io->ih_len = udp->uh_ulen;  hl = ntohs(udp->uh_ulen)+sizeof(struct ip);  if (in_cksum((unsigned short *)nudpip,hl))     return -2;  memcpy(udpip->ip, &save_ip, sizeof(struct ip));  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -