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

📄 udp.c

📁 Hermit-at-1.1.3,一款bootloader
💻 C
字号:
#include <target/io.h>#include <target/net/eth.h>#include <target/net/eth_util.h>#include <target/net/ip.h>#include <target/net/udp.h>//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++static unsigned short udp_checksum(const ip_pseudo_header *__pheader,				   const void *__buf,				   const unsigned int buflen){  unsigned short *buf;  unsigned long sum;  int i;  buf = (unsigned short *)__pheader;  for(sum = 0, i = 0; i < 6; i++){    sum += buf[i];  }  buf = (unsigned short *)__buf;  for(i = 0; i < (buflen / 2); i++){    sum += buf[i];  }  if(buflen % 2){    sum += (buf[i] & 0x00ff);  }  sum = (sum & 0xffff) + (sum >> 16);  sum = (sum & 0xffff) + (sum >> 16);  return (unsigned short)~sum;}//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++int udp_send(const unsigned char *dst_ipaddr,	     const unsigned short dst_port,	     const unsigned short src_port,	     const void *pbuf, const unsigned int pbuflen){  unsigned char buf[2048];  udp_frame *udpfr = (udp_frame *)buf;  unsigned int udpfr_len = sizeof(udp_frame);  ip_pseudo_header pheader;  unsigned short checksum;    //create pseudo header  safe_memcpy(pheader.dst_ipaddr, dst_ipaddr, 4);  safe_memcpy(pheader.src_ipaddr, eth_ipaddr, 4);  pheader.zero = 0;  pheader.protocol = IP_PROTOCOL_UDP;  pheader.data_len = htons((unsigned short)pbuflen + udpfr_len);  //create udp header  udpfr->src_port = htons(src_port);  udpfr->dst_port = htons(dst_port);  udpfr->data_len = htons((unsigned short)(pbuflen + udpfr_len));  udpfr->checksum = 0;  safe_memcpy(&buf[udpfr_len], pbuf, pbuflen);  checksum = udp_checksum(&pheader, buf, udpfr_len + pbuflen);  udpfr->checksum = checksum;  return ip_send(dst_ipaddr, IP_PROTOCOL_UDP, buf, udpfr_len + pbuflen);}//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++int udp_proc(const unsigned char *src_ipaddr,	     const unsigned short dst_port, unsigned short *src_port, 	     void **pbuf, unsigned int *pbuflen){  udp_frame *udpfr;  unsigned char *proc_pbuf = 0;  unsigned int proc_pbuflen = 0;  ip_pseudo_header pheader;  unsigned short checksum;  unsigned short tmp;  int ret;  while(1){    ret = ip_proc(UDP_WAIT, (void *)&proc_pbuf, &proc_pbuflen);    if(ret == -1){      return -1;    }    if(proc_pbuflen < sizeof(udp_frame)){      continue;    }    udpfr = (udp_frame *)proc_pbuf;    if(pbuf != 0){      *pbuf = (void *)(proc_pbuf + sizeof(udp_frame));    }    if(pbuflen != 0){      *pbuflen = proc_pbuflen - sizeof(udp_frame);    }    if(src_port != 0){      *src_port = ntohs(udpfr->src_port);    }        //create pseudo header    safe_memcpy(pheader.dst_ipaddr, eth_ipaddr, 4);     safe_memcpy(pheader.src_ipaddr, src_ipaddr, 4);    pheader.zero = 0;    pheader.protocol = IP_PROTOCOL_UDP;    pheader.data_len = htons(proc_pbuflen);    checksum = udpfr->checksum;    if(checksum != 0){      udpfr->checksum = 0;            tmp = udp_checksum(&pheader, proc_pbuf, proc_pbuflen);      if(tmp == 0){	tmp = 0xffff;      }            if(checksum != tmp){	continue;      }    }    _DEBUG("src_port: %d\n", ntohs(udpfr->src_port));    _DEBUG("dst_port: %d\n", ntohs(udpfr->dst_port));    if(dst_port == ntohs(udpfr->dst_port)){      return 0;    }  }  return 0;}

⌨️ 快捷键说明

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