!CheckUDP: UDP header checksum failure怎么解决

KITL与LCD驱动冲突
作者在使用KITL过程中遇到LCD驱动加载后系统不正常工作的问题,并出现CheckUDP:UDPheaderchecksumfailure错误。屏蔽LCD驱动后,GWES异常但KITL功能恢复。

搞KITL搞了一段时间了,一个一个坎儿都过去了。现在也能进入到CE系统中了,可是,当LCD的驱动加载后(可能是他的原因),KITL就不正常工作了。

一直报一个错误"CheckUDP: UDP header checksum failure",不知道如何解决了。

屏蔽过LCD驱动后,GWES会出异常,倒是KITL似乎能用了,就是之前的可以敲命令看运行信息的部分可以有反应了。

之前不好使的USB功能也可以了,不知道为什么。。。。

哪位大虾帮我一下。

转载于:https://www.cnblogs.com/frankjobs/archive/2008/11/22/1339186.html

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netinet/ip.h> #include <netinet/udp.h> // 计算校验和函数 unsigned short checksum(void *b, int len) { unsigned short *buf = b; unsigned int sum = 0; unsigned short result; for (sum = 0; len > 1; len -= 2) sum += *buf++; if (len == 1) sum += *(unsigned char *)buf; sum = (sum >> 16) + (sum & 0xFFFF); sum += (sum >> 16); result = ~sum; return result; } int main() { int sockfd; char buffer[1024]; struct sockaddr_in dest_addr; // 创建原始套接字 if ((sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) { perror("socket() error"); exit(EXIT_FAILURE); } // 设置目标地址 memset(&dest_addr, 0, sizeof(dest_addr)); dest_addr.sin_family = AF_INET; dest_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 目标IP // 构建IP头部 struct iphdr *ip_header = (struct iphdr *)buffer; ip_header->ihl = 5; // 头部长度(32位字) ip_header->version = 4; // IPv4 ip_header->tos = 0; // 服务类型 ip_header->tot_len = sizeof(struct iphdr) + sizeof(struct udphdr) + 5; // 总长度 ip_header->id = htons(54321); // 标识 ip_header->frag_off = 0; // 分片偏移 ip_header->ttl = 64; // 生存时间 ip_header->protocol = IPPROTO_UDP; // 协议类型 ip_header->saddr = inet_addr("127.0.0.1"); // 源IP ip_header->daddr = dest_addr.sin_addr.s_addr; // 目标IP ip_header->check = 0; // 先置0再计算校验和 ip_header->check = checksum((unsigned short *)ip_header, ip_header->ihl*4); // 构建UDP头部 struct udphdr *udp_header = (struct udphdr *)(buffer + sizeof(struct iphdr)); udp_header->source = htons(12345); // 源端口 udp_header->dest = htons(54321); // 目标端口 udp_header->len = htons(sizeof(struct udphdr) + 5); // UDP总长度 udp_header->check = 0; // 先置0 // 添加UDP数据 char *data = buffer + sizeof(struct iphdr) + sizeof(struct udphdr); strcpy(data, "TEST"); // 计算UDP校验和(包含伪头部) char pseudo[1024]; struct pseudo_udp_header { u_int32_t src_ip; u_int32_t dst_ip; u_int8_t zero; u_int8_t protocol; u_int16_t length; } *pseudo_header = (struct pseudo_udp_header *)pseudo; pseudo_header->src_ip = ip_header->saddr; pseudo_header->dst_ip = ip_header->daddr; pseudo_header->zero = 0; pseudo_header->protocol = IPPROTO_UDP; pseudo_header->length = udp_header->len; // 拼接伪头部+UDP头部+数据 memcpy(pseudo + sizeof(struct pseudo_udp_header), udp_header, ntohs(udp_header->len)); udp_header->check = checksum(pseudo, sizeof(struct pseudo_udp_header) + ntohs(udp_header->len)); // 发送数据包 if (sendto(sockfd, buffer, ip_header->tot_len, 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr)) < 0) { perror("sendto() error"); close(sockfd); exit(EXIT_FAILURE); } printf("UDP packet sent. Check Wireshark for verification.\n"); close(sockfd); return 0; } 分析
最新发布
08-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值