搜索
bottom↓
回复: 14

lwip的UDP socket如何实现不接收广播数据和只接收广播数据功能

[复制链接]

出0入0汤圆

发表于 2018-1-17 09:58:33 | 显示全部楼层 |阅读模式
如题,现在在做lwip在ucosii下的UDP广播接收功能和不接收广播数据程序。程序如下:
现在的问题是:
1、不管使用方法1还是2,他们都可以接收广播数据
2、我使用UDP调试助手发送广播数据,这个助手为什么除了给255.255.255.255发送消息外还给我的设备ip也发送了一次数据呢

如何实现udp只接收广播数据功能和不接收广播数据功能呢?先后使用setsockopt和getsockopt均没有实现,哪位仁兄做过类似的指点下,谢谢
  1. void UDP_Search(void *pdata)
  2. {
  3.   LWIP_UNUSED_ARG(pdata);
  4.   struct sockaddr_in  server, client;
  5.   int                 socket,   RecvLen;
  6.   socklen_t length = sizeof(struct sockaddr);
  7.   ip_addr_t  LocalIP;

  8.   server.sin_family       = AF_INET;
  9.   server.sin_port         = htons(12345);  
  10.   
  11.   //方法1:绑定 INADDR_ANY IP,能收到广播数据
  12.   server.sin_addr.s_addr  = htonl( INADDR_ANY );
  13.   //方法2:绑定本地的IP,也能收到广播数据
  14.   IP4_ADDR(&LocalIP, 192, 168, 1, 22);
  15.   server.sin_addr.s_addr  = LocalIP.addr;
  16.   
  17.   socket = socket( AF_INET, SOCK_DGRAM, 0);      
  18.   bind( socket, (struct sockaddr *)&server, sizeof(server));  
  19.   while(1)
  20.   {
  21.     RecvLen = recvfrom(socket,Bufffer,sizeof(Bufffer),0,(struct sockaddr *)&client, &length);//阻塞线程接收UDP数据
  22.     sendto(socket,UDP_Server_SendBuf,RecvLen,0,(struct sockaddr *)&client,length);
  23.     OSTimeDlyHMSM(0,0,0,500);
  24.   }
  25. }
复制代码

出0入0汤圆

发表于 2018-1-17 09:58:34 | 显示全部楼层
这两个配置使能了没?

/**
* IP_SOF_BROADCAST=1: Use the SOF_BROADCAST field to enable broadcast
* filter per pcb on udp and raw send operations. To enable broadcast filter
* on recv operations, you also have to set IP_SOF_BROADCAST_RECV=1.
*/
#ifndef IP_SOF_BROADCAST
#define IP_SOF_BROADCAST                0
#endif

/**
* IP_SOF_BROADCAST_RECV (requires IP_SOF_BROADCAST=1) enable the broadcast
* filter on recv operations.
*/
#ifndef IP_SOF_BROADCAST_RECV
#define IP_SOF_BROADCAST_RECV           0
#endif

出0入0汤圆

 楼主| 发表于 2018-1-17 11:50:06 | 显示全部楼层
上传一个非常好用的TCP UDP调试工具,功能非常的全,目前遇到的最好的一个



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2018-1-17 14:16:43 | 显示全部楼层
顶起来,,,,帖子不能沉下去啊。。。看来用lwip的人还挺少

出0入0汤圆

 楼主| 发表于 2018-1-18 08:37:26 | 显示全部楼层
abl 发表于 2018-1-17 15:14
这两个配置使能了没?

/**

这两个宏我没设置,默认是0,应该不使能广播接收的

但是我那个代码就可以接收广播

出0入0汤圆

 楼主| 发表于 2018-1-18 08:59:58 | 显示全部楼层
abl 发表于 2018-1-17 15:14
这两个配置使能了没?

/**

这个是全局配置,如果我过滤掉广播的话另一个任务就收不到广播了

我想一个任务可以收到,另一个不收到广播

出0入0汤圆

 楼主| 发表于 2018-1-22 09:07:56 | 显示全部楼层
目前看来,这个是全局性的,无法修改某个socket的属性的

出0入0汤圆

发表于 2018-1-22 14:39:07 | 显示全部楼层
第一个宏定义使能 SOF_BROADCAST 域,使lwip具有过滤功能。
第二个宏定义使能接收过滤。
具体哪个链接要不要接收广播,还要通过 setsockopt 设置。

出0入0汤圆

 楼主| 发表于 2018-1-22 14:59:06 | 显示全部楼层
abl 发表于 2018-1-22 14:39
第一个宏定义使能 SOF_BROADCAST 域,使lwip具有过滤功能。
第二个宏定义使能接收过滤。
具体哪个链接要不 ...

下面的语句可以打开广播接收功能,但是无法关闭,即我在任务A是打开后,任务B中也可以收广播了,我怎么关闭任务B的socket的广播接收功能呢
int optVal = 1;
setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(void *)optVal,sizeof(int));

出0入0汤圆

发表于 2018-1-22 16:33:10 | 显示全部楼层
int optVal = 0;
setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(void *)optVal,sizeof(int));
这样关不掉?

出0入0汤圆

 楼主| 发表于 2018-1-22 17:45:12 | 显示全部楼层
abl 发表于 2018-1-22 16:33
int optVal = 0;
setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(void *)optVal,sizeof(int));
这样关不掉? ...

不行,关不掉啊

出0入0汤圆

发表于 2018-1-24 10:48:44 | 显示全部楼层
xtaens 发表于 2018-1-22 17:45
不行,关不掉啊

看来只能跟踪一下了。

#if IP_SOF_BROADCAST_RECV
            (broadcast && ip_get_option(pcb, SOF_BROADCAST) &&
             (ip_addr_isany(&pcb->local_ip) ||
              ip_addr_netcmp(&pcb->local_ip, ip_current_dest_addr(), &inp->netmask)))) {
#else /* IP_SOF_BROADCAST_RECV */
            (broadcast &&
             (ip_addr_isany(&pcb->local_ip) ||
              ip_addr_netcmp(&pcb->local_ip, ip_current_dest_addr(), &inp->netmask)))) {
#endif /* IP_SOF_BROADCAST_RECV */

从源码看, 只有使能了 IP_SOF_BROADCAST_RECV 才对 SOF_BROADCAST 进行判断,否则是接收广播的。

出0入0汤圆

 楼主| 发表于 2018-1-24 14:52:22 | 显示全部楼层
abl 发表于 2018-1-24 10:48
看来只能跟踪一下了。

#if IP_SOF_BROADCAST_RECV

嗯,得跟踪仿真下源码了

最近忙其他的了,这个问题暂时放下,现在功能都正常,收广播也没事了现在觉得

出0入0汤圆

 楼主| 发表于 2018-1-29 11:32:19 | 显示全部楼层
topdreams 发表于 2018-1-27 06:24
底层驱动配置有没有选项?这是全局的

目前看似乎是这样的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 22:05

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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