我是靠谱客的博主 忐忑月亮,最近开发中收集的这篇文章主要介绍UDP计算校验和,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

  1. static unsigned short checksum(unsigned short *pwbuffer,uint32_t size)  
  2. {  
  3.     unsigned long cksum=0;  
  4.     while(size > 1){  
  5.         cksum+=*pwbuffer++;  
  6.         size-=sizeof(uint16_t);  
  7.     }  
  8.     if(size){  
  9.         cksum+=*(uint8_t*)pwbuffer;  
  10.     }  
  11.     cksum=(cksum>>16)+(cksum&0xffff);  
  12.     cksum+=(cksum >> 16);  
  13.     return (unsigned short)(~cksum);  
  14. }  
  15. static unsigned int inline   
  16. udp_checksum(unsigned long saddr,  
  17.              unsigned long daddr,  
  18.              unsigned short *buffer,  
  19.              int size)  
  20. {  
  21.     unsigned char rawBuf[1024];  
  22.     struct pseudo_hdr  
  23.     {  
  24.         struct in_addr  src;  
  25.         struct in_addr  dst;  
  26.         uint8_t         mbz;  
  27.         uint8_t         proto;  
  28.         uint16_t        len;  
  29.     } __attribute__((__packed__));  
  30.     unsigned long sum = 0;  
  31.     struct pseudo_hdr *ph;  
  32.     int ph_len = sizeof(struct pseudo_hdr);  
  33.     ph = (struct pseudo_hdr *)rawBuf;  
  34.     ph->src.s_addr = saddr;  
  35.     ph->dst.s_addr = daddr;  
  36.     ph->mbz = 0;  
  37.     ph->proto = IPPROTO_UDP;  
  38.     ph->len = htons(size); //这里的长度为udp header + payload 的总和  
  39.     //buffer = udpheader + payload,  size = sizeof(udpheader + payload)  
  40.     memcpy(rawBuf + ph_len, buffer, size);   
  41.     //ph_len + size 是虚假头长+UDP长+payload长。来计算checksum  
  42.     sum = checksum((unsigned short*)rawBuf,ph_len+size);  
  43.     return(sum);  
  44. }  

最后

以上就是忐忑月亮为你收集整理的UDP计算校验和的全部内容,希望文章能够帮你解决UDP计算校验和所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部