W5500接收udp广播数据
最近使用w5500做测试,配置为udp客户端,向255.255.255.255,端口号为4000发送数据,socket工具可以监听到广播包;但是配置为udp服务器接收广播包时候(端口号为4001),在socket tool中配置远端ip为255.255.255.255,端口号为4001,服务器却收不到广播数据包,请问各位大神,有谁会知道这个问题怎么处理不?
以下是udp服务端代码:
int32_t do_udps(uint8_t sn, uint8_t* buf, uint16_t port)
{
int32_tret;
uint16_t size, sentsize;
uint8_tdestip;
uint16_t destport;
switch(getSn_SR(sn))
{
case SOCK_UDP :
if((size = getSn_RX_RSR(sn)) > 0)
{
if(size > UDPSERVER_BUF_SIZE) size = UDPSERVER_BUF_SIZE;
ret = recvfrom(sn, buf, size, destip, (uint16_t*)&destport);
if(ret <= 0)
{
#ifdef _LOOPBACK_DEBUG_
printf("%d: recvfrom error. %ld\r\n",sn,ret);
#endif
return ret;
}
size = (uint16_t) ret;
sentsize = 0;
RevSetIPmsgFlag = 1;
printf("UDP 收到数据\r\n");
while(sentsize != size)
{
ret = sendto(sn, buf+sentsize, size-sentsize, destip, destport);
if(ret < 0)
{
#ifdef _LOOPBACK_DEBUG_
printf("%d: sendto error. %ld\r\n",sn,ret);
#endif
return ret;
}
sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
}
}
break;
case SOCK_CLOSED:
#ifdef _LOOPBACK_DEBUG_
//printf("%d:UDP loopback start\r\n",sn);
#endif
if((ret = socket(sn, Sn_MR_UDP, port, 0x00)) != sn)
return ret;
#ifdef _LOOPBACK_DEBUG_
printf("%d:Opened, UDP loopback, port [%d]\r\n", sn, port);
#endif
break;
default :
break;
}
return 1;
}
W5500有办法有什么寄存器可以查询接到数据了不。 eric2013 发表于 2021-10-9 15:57
W5500有办法有什么寄存器可以查询接到数据了不。
getSn_RX_RSR(sn))函数就是判断读取socket端口接收寄存器的 阴世幽泉 发表于 2021-10-9 16:35
getSn_RX_RSR(sn))函数就是判断读取socket端口接收寄存器的
局域网内其它电脑也开个网络助手,看看正常不,如果正常,那确实是5500的问题了。 eric2013 发表于 2021-10-9 17:05
局域网内其它电脑也开个网络助手,看看正常不,如果正常,那确实是5500的问题了。
找到原因了,就是socket tool工具原因,我用抓包工具,在同一台电脑上各开一个udp客户端和服务器,结果发现广播的数据抓不到,广播的数据包应该是回环了没有经过路由器,我让朋友做了小软件测试验证,这下就可以抓到数据包了,同时板子也可以收到广播数据; 阴世幽泉 发表于 2021-10-9 19:35
找到原因了,就是socket tool工具原因,我用抓包工具,在同一台电脑上各开一个udp客户端和服务器,结果发 ...
谢谢告知最终原因,看来排查下网络助手很有必要。
页:
[1]