硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2290|回复: 5
收起左侧

[网络应用] W5500接收udp广播数据

[复制链接]

2

主题

28

回帖

34

积分

新手上路

积分
34
发表于 2021-10-9 15:23:17 | 显示全部楼层 |阅读模式
  最近使用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_t  ret;
   uint16_t size, sentsize;
   uint8_t  destip[4];
   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;
}

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2021-10-9 15:57:19 | 显示全部楼层
W5500有办法有什么寄存器可以查询接到数据了不。
回复

使用道具 举报

2

主题

28

回帖

34

积分

新手上路

积分
34
 楼主| 发表于 2021-10-9 16:35:06 | 显示全部楼层
eric2013 发表于 2021-10-9 15:57
W5500有办法有什么寄存器可以查询接到数据了不。

getSn_RX_RSR(sn))  函数就是判断读取socket端口接收寄存器的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2021-10-9 17:05:30 | 显示全部楼层
阴世幽泉 发表于 2021-10-9 16:35
getSn_RX_RSR(sn))  函数就是判断读取socket端口接收寄存器的

局域网内其它电脑也开个网络助手,看看正常不,如果正常,那确实是5500的问题了。
回复

使用道具 举报

2

主题

28

回帖

34

积分

新手上路

积分
34
 楼主| 发表于 2021-10-9 19:35:46 | 显示全部楼层
eric2013 发表于 2021-10-9 17:05
局域网内其它电脑也开个网络助手,看看正常不,如果正常,那确实是5500的问题了。

找到原因了,就是socket tool工具原因,我用抓包工具,在同一台电脑上各开一个udp客户端和服务器,结果发现广播的数据抓不到,广播的数据包应该是回环了没有经过路由器,我让朋友做了小软件测试验证,这下就可以抓到数据包了,同时板子也可以收到广播数据;
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2021-10-10 09:43:41 | 显示全部楼层
阴世幽泉 发表于 2021-10-9 19:35
找到原因了,就是socket tool工具原因,我用抓包工具,在同一台电脑上各开一个udp客户端和服务器,结果发 ...

谢谢告知最终原因,看来排查下网络助手很有必要。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-26 22:16 , Processed in 0.162076 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表