东光网站建设淘宝店铺装修,哪家公司建换电站,大型网站和小企业站优化思路,网站搜索量查询以太网报文格式#xff1a;IP 报文格式#xff1a;UDP 报文格式#xff1a;校验和函数#xff1a;/*******************************************************功能#xff1a;校验和函数参数#xff1a;buf: 需要校验数据的首地址nword: 需要校验数据长度的一半返回值IP 报文格式UDP 报文格式校验和函数/*******************************************************功能校验和函数参数buf: 需要校验数据的首地址nword: 需要校验数据长度的一半返回值校验和*******************************************************/unsigned short checksum(unsigned short *buf, int nword){unsigned long sum;for(sum 0; nword 0; nword--){sum htons(*buf);buf;}sum (sum16) (sum0xffff);sum (sum16);return ~sum;}需要C/C Linux服务器架构师学习资料私信“资料”(资料包括C/CLinuxgolang技术NginxZeroMQMySQLRedisfastdfsMongoDBZK流媒体CDNP2PK8SDockerTCP/IP协程DPDKffmpeg等)免费分享这里是在linux下通过原始套接字组一个 udp 数据包给 PC 机的网络调试助手发送信息#include #include #include #include //struct ifreq#include //ioctl、SIOCGIFADDR#include #include //ETH_P_ALL#include //struct sockaddr_ll unsigned short checksum(unsigned short *buf, int nword);//校验和函数int main(int argc, char *argv[]){//1.创建通信用的原始套接字int sock_raw_fd socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));//2.根据各种协议首部格式构建发送数据报unsigned char send_msg[1024] {//--------------组MAC--------14------0x74, 0x27, 0xea, 0xb5, 0xef, 0xd8, //dst_mac: 74-27-EA-B5-FF-D80xc8, 0x9c, 0xdc, 0xb7, 0x0f, 0x19, //src_mac: c8:9c:dc:b7:0f:190x08, 0x00, //类型0x0800 IP协议//--------------组IP---------20------0x45, 0x00, 0x00, 0x00, //版本号4, 首部长度20字节, TOS:0, --总长度--0x00, 0x00, 0x00, 0x00,//16位标识、3位标志、13位片偏移都设置00x80, 17, 0x00, 0x00,//TTL128、协议UDP(17)、16位首部校验和10, 221, 20, 11,//src_ip: 10.221.20.1110, 221, 20, 10,//dst_ip: 10.221.20.10//--------------组UDP--------87886------0x1f, 0x90, 0x1f, 0x90, //src_port:0x1f90(8080), dst_port:0x1f90(8080)0x00, 0x00, 0x00, 0x00, //#--16位UDP长度--30个字节、#16位校验和};int len sprintf(send_msg42, %s, this is for the udp test);if(len % 2 1)//判断len是否为奇数{len;//如果是奇数len就应该加1(因为UDP的数据部分如果不为偶数需要用0填补)}*((unsigned short *)send_msg[16]) htons(208len);//IP总长度 20 8 len*((unsigned short *)send_msg[14204]) htons(8len);//udp总长度 8 len//3.UDP伪头部unsigned char pseudo_head[1024] {//------------UDP伪头部--------12--10, 221, 20, 11,//src_ip: 10.221.20.1110, 221, 20, 10,//dst_ip: 10.221.20.100x00, 17, 0x00, 0x00, //0,17,#--16位UDP长度--20个字节};*((unsigned short *)pseudo_head[10]) htons(8 len);//为头部中的udp长度(和真实udp长度是同一个值)//4.构建udp校验和需要的数据报 udp伪头部 udp数据报memcpy(pseudo_head12, send_msg34, 8len);//--计算udp校验和时需要加上伪头部--//5.对IP首部进行校验*((unsigned short *)send_msg[24]) htons(checksum((unsigned short *)(send_msg14),20/2));//6.--对UDP数据进行校验--*((unsigned short *)send_msg[40]) htons(checksum((unsigned short *)pseudo_head,(128len)/2));//6.发送数据struct sockaddr_ll sll;//原始套接字地址结构struct ifreq req;//网络接口地址strncpy(req.ifr_name, eth0, IFNAMSIZ);//指定网卡名称if(-1 ioctl(sock_raw_fd, SIOCGIFINDEX, req))//获取网络接口{perror(ioctl);close(sock_raw_fd);exit(-1);}/*将网络接口赋值给原始套接字地址结构*/bzero(sll, sizeof(sll));sll.sll_ifindex req.ifr_ifindex;len sendto(sock_raw_fd, send_msg, 14208len, 0 , (struct sockaddr *)sll, sizeof(sll));if(len -1){perror(sendto);}return 0;} unsigned short checksum(unsigned short *buf, int nword){unsigned long sum;for(sum 0; nword 0; nword--){sum htons(*buf);buf;}sum (sum16) (sum0xffff);sum (sum16);return ~sum;}运行结果如下