lwip udp无法发送大于1472字节数据问题解决

1.问题定位

首先抓包工具进行抓包

wireshark勾选UDP 协议的checksum选项

抓包以后发现是udp的checksum有问题

2.原因剖析

有些网卡的硬件校验对于小于1500字节的数据的校验计算是正确的,大于1500字节的数据的校验计算是错误的,导致接收端无法接收。

3.解决之道

根据以上原因我们应该禁用网卡的硬件校验,使能lwip的软件校验便可以成功解决这个问题。另外还需要打开IP_FRAG 和 IP_REASSEMBLY两个宏定义,打开分包发送功能,使能这两个宏,只要传输数据大于mtu(1500)lwip就会使用分包发送功能,这两个宏默认是使能的。

问题成功解决

ps:一定要彻底禁用网卡的硬件校验功能,禁用不彻底可能会导致ping不通,但是可能tcp通讯没有问题的问题。

lwIP 中,发送 UDP 数据包的基本步骤如下: 1. 创建一个 `struct udp_pcb` 对象,用于表示 UDP 协议控制块,通过调用 `udp_new()` 函数来实现。 2. 通过调用 `udp_bind()` 函数将 `struct udp_pcb` 对象与一个本地端口号绑定,以便接收 UDP 数据包。 3. 通过调用 `udp_connect()` 函数将 `struct udp_pcb` 对象与目标 IP 地址以及目标端口号连接起来,以便发送 UDP 数据包。 4. 创建一个 `struct pbuf` 对象,用于存储待发送数据,可以通过调用 `pbuf_alloc()` 函数来实现。 5. 调用 `udp_sendto()` 函数将数据发送给指定的目标地址,如果发送成功,函数将返回发送数据大小;否则,返回值为负数,表示发送失败。 6. 在不需要发送 UDP 数据包时,需要通过调用 `udp_disconnect()` 和 `udp_remove()` 函数分别关闭连接并释放资源。 下面是一个示例代码,用于发送 UDP 数据包: ```c struct udp_pcb *pcb; struct pbuf *p; ip_addr_t remote_ip; uint16_t remote_port; /* 创建 UDP 协议控制块 */ pcb = udp_new(); /* 绑定本地端口号 */ udp_bind(pcb, IP_ADDR_ANY, 1234); /* 连接目标地址和端口号 */ IP4_ADDR(&remote_ip, 192, 168, 1, 100); remote_port = 5678; udp_connect(pcb, &remote_ip, remote_port); /* 创建数据包 */ p = pbuf_alloc(PBUF_TRANSPORT, sizeof("Hello, world!"), PBUF_RAM); memcpy(p->payload, "Hello, world!", sizeof("Hello, world!")); /* 发送数据包 */ udp_sendto(pcb, p, &remote_ip, remote_port); /* 释放资源 */ udp_disconnect(pcb); udp_remove(pcb); pbuf_free(p); ``` 在实际使用中,还需要考虑网络连接的可靠性、数据包的顺序以及重传机制等问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值