lwip可以用于发udp_LWIPUDP一对多
最近在STM32F767的开发板上移植了LWIP UDP的代码,开发板的资料里面有介绍LWIP移植的文档,介绍了几种网络通信方式,如TCP server,TCP client,UDP,按照文档里面的介绍也很容易实现。这里我选择的是基于ucos2操作系统的UDP网络通信。 开发板给的demo里面是一对一的模式,2块板子间建立UDP链接,进行网络数据传输。如下图所示:
现在项目需要实现一对多,就是1个host做主机,通过UDP方式连接多个slave,主机的IP地址固定,但slave们的IP地址只有slave本身知道,host不知道各个salve的IP地址,连接方式如下图:
对于,一对一的UDP连接,demo里面给的驱动代码很简单,主要就是几个接口函数。lwip的初始化,还有就是UDP的线程函数。为了方便阅读代码里面省略好多代码,只显示了主要的几个函数。
lwip_comm_init()lwip的初始化
//udp 任务函数
static void udp_thread(void *arg)
{
/* 1. 创建UDP结构,并绑定本地IP地址及端口号 */
udpconn = netconn_new(NETCONN_UDP); //创建一个 UDP 链接
err = netconn_bind(udpconn,IP_ADDR_ANY,UDP_DEMO_PORT);//绑定本地IP地址和端口号
/* 2. 将UDP结构与远端IP地址及端口号进行连接 */
IP4_ADDR(&destipaddr,remoteip[0],remoteip[1],remoteip[2],remoteip[3]); //构造远端 IP 地址
netconn_connect(udpconn,&destipaddr,UDP_DEMO_PORT); //连接到远端主机
/* 3. 数据发送部分 */
sentbuf = netbuf_new();
netbuf_alloc(sentbuf,strlen((char *)udp_demo_sendbuf));
err = netconn_send(udpconn,sentbuf); //将 netbuf 中的数据发送出去
netbuf_delete(sentbuf); //删除 buf
/* 4. 数据接收部分 */
netconn_recv(udpconn,&recvbuf);
}
上面代码是在双方确定IP地址的情况下,建立的连接,并进行数据传输的方式。2块板子的代码是一样的,只是要分清本地IP(自己的IP)和remote IP(对端的IP)就好了。
下面修改代码以实现一对多的UDP方式。一下是host端的代码,至于slave端的代码就是和上面的代码一样,注意host不知道slave的IP地址,但是slave知道host的IP地址。这里host和slave都是人为分的,并不是网络里面的概念。
lwip_comm_init()lwip的初始化
//udp 任务函数
static void udp_thread(void *arg)
{
/* 1. 创建UDP结构,并绑定本地IP地址及端口号,对于host来说,不需要调用什么建立连接函数,
在完成了UDP结构创建及绑定本地IP之后就可以接收来自任何slave发送来的数据 */
udpconn = netconn_new(NETCONN_UDP); //创建一个 UDP 链接
err = netconn_bind(udpconn,IP_ADDR_ANY,UDP_DEMO_PORT);//绑定本地IP地址和端口号
/* 4. 数据接收部分 */
netconn_recv(udpconn,&recvbuf);
if(recvbuf != NULL){
//接收到数据,假设这里接收到的是slave发上来的自己的IP地址,并将IP地址放在remoteip[]中,
那么可以将上面代码的第二第三部分放在这里,实现host和远端slave建立连接,并向slave发送一笔数据。
/* 2. 将UDP结构与远端IP地址及端口号进行连接 */
IP4_ADDR(&destipaddr,remoteip[0],remoteip[1],remoteip[2],remoteip[3]); //构造远端 IP 地址
netconn_connect(udpconn,&destipaddr,UDP_DEMO_PORT); //连接到远端主机
/* 3. 数据发送部分 */
sentbuf = netbuf_new();
netbuf_alloc(sentbuf,strlen((char *)udp_demo_sendbuf));
err = netconn_send(udpconn,sentbuf); //将 netbuf 中的数据发送出去
netbuf_delete(sentbuf); //删除 buf
}
}
lwip可以用于发udp_LWIPUDP一对多相关推荐
- lwip可以用于发udp_CubeMX初始化正点原子STM32F407 LAN8720A调通LWIP
正点原子芯片的外接晶振是8Mhz,CubeMX软件外部晶振认是25Mhz,不过我们这里问题不大,用内部晶振.算了,还是用外部吧,外部的精确. 时钟树的配置算是老规矩,168Mhz最大. 然后就是ETH ...
- 建行短暂上线数字货币,可用于发工资,不会替代微信和支付宝
"对于人民银行研发的数字人民币,并不是大家理解的加密资产,而是人民币的数字化." 本文谨代表作者个人观点,不代表火星财经立场,该内容旨在传递更多市场信息,不构成任何投资建议. 整理 ...
- vba给服务器发送消息,使用VBA实现发邮件功能
财务MM经常要给员工发送每月的工资信息,一个个发送实在是太忙了.本文将介绍使用VBA实现工资信息的自动发送.有了这个功能,财务MM只需要把基本数据准备好,然后按下按钮只要选择需要发送的对象.就可以快速 ...
- LwIP 之一 源码目录文件详解及移植说明
lwIP 是 TCP/IP 协议套件的一个小型独立实现.lwIP TCP/IP 实现的重点是减少 RAM 使用同时仍然有一个完整的 TCP. 这使得 lwIP 适合使用在具有数 10 千字节的可 ...
- EOS 命令行创建账号及发币
基于centos7 1611 安装docker-ce,一定是docker-ce而不能是老版的docker 下载eos镜像 docker pull eosio/eos 单独启动钱包 docker run ...
- python实现给你女朋友发天气预报和情话
今天说一下如何用python给你女朋友发天气预报和情话,让她明白程序员也有浪漫 整体思路: 上网爬取天气信息 上网爬取情话 发邮件 实现定时发邮件 需要用到的模块: requests:用于向网站发送请 ...
- matlab 训练一个用于降维的暹罗网络(孪生网络)
原文:https://ww2.mathworks.cn/help/deeplearning/ug/train-a-siamese-network-for-dimensionality-reductio ...
- Lwip中实现DM9000/DM9003驱动之一
目录 一:Lwip协议栈结构 二:两个重要的数据结构 1.Netif 2.Ethernetif 三:数据收发流程 1.分层的实现方式 2.数据流程 1.函数注册 2.接口初始化 3.数据发送 4.数据 ...
- CSMA/CD在全双工和半双工模式下的区别
谈谈以太网中何时使用CSMA/CD冲突检测机制 关于以太网何时使用CSMA/CD检测机制,这个问题前两天刚和朋友做了讨论.在网络上搜索和很久,也有一些同行们不太理解,特别是一些初学CCNA的,没有工作 ...
最新文章
- mysql docker 制作_docker 制作自己的mysql镜像
- 这个比肩ImageNet的数据集遭MIT紧急下架,原因令人愤怒
- 【LeetCode】0830.较大分组的位置
- CentOS 6.4 Heartbeat+mysql+nfs实现高可用的mysql集群
- ctypes python_Python使用Ctypes与C/C++
- php 后门代码_分析一段PHP的后门代码,很恶心
- 基于html5背景图片自适应代码
- SQL中触发器实例讲解(转)
- 面试官让我用channel实现sync包里的同步锁,是不是故意为难我?
- 氢气露点和湿度换算_如何创建氢气鼓组以获取乐趣和收益
- 常用JavaScript 收集
- int 转为字节后 低字节在前_NumPy 字节交换
- Linux 网络安全技巧
- nginx集群部署,实现负载均衡和nfs共享
- 金融:收益利率计算器
- 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。剑指Offer(32)
- openCV教程04
- 【初/中级前端面经】中小型公司面试时都会问些什么?
- Leetcode_NO199_二叉树的左视图,右视图
- 软件测试方法—动态测试
热门文章
- 完整的Python 3和树莓Pi大师课 Complete Python 3 and Raspberry Pi Masterclass
- 读书:有趣 -- 酒鬼与圣徒
- awk3.0 — awk变量
- 40.多进程同步--锁--多把锁
- 服务器 主动 推送 客户端浏览器 消息***
- 洛谷—— P1118 [USACO06FEB]数字三角形Backward Digit Su…
- WPF中Auto与*的差别
- 标定(二)----------双目相机与IMU联合标定(工具箱使用方法——Kalibr)
- Java线上问题排障:Linux内核bug引发JVM死锁导致线程假死
- PHP数据库连接池SQL Relay安装使用