你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f107vct6 同时使用TCP udp广播出现断网的问题

[复制链接]
nosignal 提问时间:2017-3-31 11:05 /
各位大神好,

      我是stm32初学者,目前我代码运行的有TCP的客户端和client,另外我又加入了udp广播,结果发现当我发送udp广播后,板子就ping不通了,tcp服务端也连不上,但是广播数据还是在发送,我的udp广播代码如下

  1. void UDP_Broadcast_Send_IP(void)
  2. {
  3.     struct netbuf *buf_send;
  4.     unsigned short payload_len=0;
  5.     unsigned char *index=NULL;
  6.     unsigned char send_buff[23],pos=0;
  7.     struct netconn *bc_clientconn;
  8.     err_t ret=0;

  9.     bc_clientconn = netconn_new(NETCONN_UDP);      

  10.     if(bc_clientconn==NULL)
  11.         return;

  12.     ret=netconn_bind(bc_clientconn,IP_ADDR_ANY,11008);

  13.     /* Prepare data */
  14.     buf_send = netbuf_new();
  15.     send_buff[pos++]=0xFE;
  16.     send_buff[pos++]=0xEF;

  17.     #if    LWIP_DHCP//Åжϵ±Ç°ÊÇ·ñΪ×Ô¶¯»ñÈ¡IP
  18.     send_buff[pos++]=0;
  19.     #else
  20.     send_buff[pos++]=1;
  21.     #endif
  22.    
  23.     //IPµØÖ·
  24.     send_buff[pos++]=(unsigned char)(DP83848_netif.ip_addr.addr);
  25.     send_buff[pos++]=(unsigned char)(DP83848_netif.ip_addr.addr>>8);
  26.     send_buff[pos++]=(unsigned char)(DP83848_netif.ip_addr.addr>>16);
  27.     send_buff[pos++]=(unsigned char)(DP83848_netif.ip_addr.addr>>24);

  28.     //MAC
  29.     send_buff[pos++]=MACaddr[0];
  30.     send_buff[pos++]=MACaddr[1];
  31.     send_buff[pos++]=MACaddr[2];
  32.     send_buff[pos++]=MACaddr[3];
  33.     send_buff[pos++]=MACaddr[4];
  34.     send_buff[pos++]=MACaddr[5];


  35.     //Íø¹Ø
  36.     send_buff[pos++]=(unsigned char)(DP83848_netif.gw.addr);
  37.     send_buff[pos++]=(unsigned char)(DP83848_netif.gw.addr>>8);
  38.     send_buff[pos++]=(unsigned char)(DP83848_netif.gw.addr>>16);
  39.     send_buff[pos++]=(unsigned char)(DP83848_netif.gw.addr>>24);
  40.    
  41.     //×ÓÍøÑÚÂë
  42.     send_buff[pos++]=(unsigned char)(DP83848_netif.netmask.addr);
  43.     send_buff[pos++]=(unsigned char)(DP83848_netif.netmask.addr>>8);
  44.     send_buff[pos++]=(unsigned char)(DP83848_netif.netmask.addr>>16);
  45.     send_buff[pos++]=(unsigned char)(DP83848_netif.netmask.addr>>24);
  46.    
  47.     send_buff[pos++]=0xEF;
  48.     send_buff[pos++]=0xFE;


  49.    
  50.     payload_len = pos;
  51.     index = netbuf_alloc(buf_send, payload_len);
  52.     memcpy (index,send_buff,payload_len);
  53.    

  54.     ret=netconn_sendto(bc_clientconn ,buf_send,IP_ADDR_BROADCAST,11009);  //·¢ËÍÊý¾Ý
  55.     netbuf_delete(buf_send);
  56.     buf_send=NULL;

  57.     netconn_delete(bc_clientconn); //ɾ³ýÁ¬½Ó
  58. }
复制代码


我做了测试,当我屏蔽    ret=netconn_sendto(bc_clientconn ,buf_send,IP_ADDR_BROADCAST,11009); 发送这句,就不会断网,ping一直能通
求各位大神帮忙看一下,TCP、udp能同时用吗在stm32上?有没有什么特殊需要设置的地方,小弟新人,求各位大神指教!!!


收藏 1 评论3 发布时间:2017-3-31 11:05

举报

3个回答
nosignal 回答时间:2017-3-31 11:25:08
我做了个测试,我将TCP关闭,只开udp,组播,广播都试了,只要调用 netconn_sendto()这个 就断网了,ping不通,但是组播包还能发出去
张亚飞 回答时间:2017-8-9 10:21:42
如果同时用tcp和udp端口是不能复用的。 你下边说关闭了TCP之后只用udp、组播也断网,你说的断网时只是网络断了还是死机了呢?  只看代码的话建议你把66行和67行的操作放在判断ret返回值里边释放缓冲区和指针。  通常来说套接字可以设置为阻塞和非阻塞,如果你的套接字是非阻塞的话发送函数不等数据发送完就返回了缓冲区和指针释放的话就出问题了。如果不行的话再继续找问题。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

无薪税绵 回答时间:2017-8-9 11:41:09
估计你发送UDP的数据量比较大吧,都被UDP占用了。
试试分时操作,比如:
做个计数器,为0时,执行 TCP,然后+1
为1时,执行UDP,然后+1
为2时,执行其它,
如此累推,当读数器到最后一组操作后,
读数器清零,重新读数。
这样,就不会阻塞了。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版