当前位置: 首页 > news >正文

正点原子lwIP学习笔记——Socket接口UDP实验

1. Socket接口UDP连接配置

Socket接口的UDP配置流程如下:

  1. sin_family 设置为 AF_INET 表示 IPv4 网络协议;
  2. sin_port 为设置端口号, 可设置为 8080;
  3. sin_addr.s_addr 设置本地 IP 地址;
  4. 调用函数 Socket 创建 Socket 连接 ,注意该函数的第二个参数 SOCK_STREAM 表示 TCP 连接 SOCK_DGRAM 表示 UDP 连接;
  5. 调用函数 bind 将本地服务器地址与 Socket 进行绑定;
  6. 调用收发函数接收或者发送。

2. Socket接口UDP实验

例程功能:
本实验使用
Socket 编程接口实现 UDP 服务器, 并可通过按键发送 UDP 广播数据至其他的 UDP 客户端,也能够接收其他 UDP 客户端广播的数据,并实时显示至 LCD 屏幕上 。

main.c和freertos.c都与之前的NETCONN实验是一样的;

lwip_demo中,可以直接IP_ADDR通过宏定义为自己的远程IP地址;这里还有一个区别,发送和接收是创建了两个线程,而之前的NETCONN在一个线程中,通过延时完成发送和接收;

通过sockaddr_in的结构体新建一个g_local_info来填写网络的相关参数,uint8_t一个数据缓冲区g_lwip_demo_recvbuf;通过lwip_data_send调用sys_thread_new新建一个发送线程,其中就传入了lwip_send_thread;然后memset对g_local_info清零,并通过其结构体参数初始化长度、IP协议和本地IP地址和端口号;然后调用socket建立一个新的Socket连接,返回给到g_sock_fd(socklen_t,就是uint32_t);

完成创建之后,通过bind把g_local_info的信息绑定到g_sock_fd

然后会进入到while死循环,通过memset初始化数据缓冲区为0;然后调用recv来进行数据接收,这是一个阻塞线程,只有接收到数据才能往下执行;接收到数据之后,调用xQueueSend,发送到显示的功能中进行显示

发送的线程,最后就是调用了自定义的lwip_send_thread;其会在g_local_info之中设置远程的IP地址;通过标志位判断是否需要发送(标志位的操作通过按键改变);发送就是调用sendto函数,发送完成后清除标志位。

3. Socket接口UDP广播实验

这里的区别就是新建了send和recv的结构体,里面存放了缓冲的buf和size大小;lwip_demo中需要建立一个link_socjet_info结构体的指针socket_info,然后mem_malloc分配socket_info的内存;之后调用socket建立连接,通过setsockopt设置optval选项值;然后配置socket_info的IP协议、端口号还有本地IP地址,需要注意这里是广播所以配置为“255.255.255.255”;之后的发送和接收就是一样的操作了。

4. Socket接口UDP组播实验

首先需要配置HAL库:
在ethernet.c中,找到HAL_ETH_Init函数,进入后下翻找到ETH_MACDMAConfig,往下找,有两个一定要如下配置:
macinit.ReceiveAll = ETH_RECEIVEALL_ENABLE;
macinit.MulticastFramesFilter = ETH_MULTICASTFRAMESFILTER_NONE;

这样才可以使用组播;

然后再lwipopts.h中找到IGMP的配置,该宏定义必须置1

找到ethernetif.c,其中网卡的flags需要如下配置:
netif->flags = NETIF_FLAG_BROADCAST|NETIF_FLAG_ETHARP|NETIF_FLAG_LINK_UP|NETIF_FLAG_IGMP; / 广播 ARP协议 链接检测 /
添加了IGMP;

组播与之前的区别就是,在link_socjet_info中添加了ip_mreq这个组播结构体multicast_mreq;然后定义一个结构体ip_mreq_t里面存储多播的控制块ip_mreq结构体的mreq以及信息长度socklen_t结构体的mreq_len

多播的IP地址为“224.0.1.0”,lwip_demo中还需要定义一个ip_mreq_t的结构体指针mreq_info;同样也要对socket_info添加IP协议和本地IP地址和端口号,然后设置就收和发送缓冲区并调用bind绑定socket_info以及本地的网络接口;

区别在于,还需要设置mreq_info,也就是组播的IP地址以及待加入的IP地址,然后调用setsockopt添加多组播成员

其余的发送和接收线程就与之前类似,这里不赘述了。

总结

Socket来进行开发比NETCONN更加简单,更多的会使用Socket来进行开发,除非对实时性要求很高,那就会自行实现RAW接口。

http://www.lryc.cn/news/176501.html

相关文章:

  • 连接组学中的机器学习:从表征学习到模型拟合
  • 数据结构-----二叉树的创建和遍历
  • 【算法题】1333. 餐厅过滤器
  • linux脚本笔记
  • 目标检测YOLO实战应用案例100讲-面向路边停车场景的目标检测(中)
  • [论文笔记]Prefix Tuning
  • electron快速入门
  • C语言的stdio.h的介绍
  • 使用香橙派 在Linux环境中安装并学习Python
  • 如何开发物联网 APP?
  • 配置pytorchGPU虚拟环境-python3.7
  • Logic Pro X10.7.9(mac乐曲制作软件)
  • 第一部分:HTML5
  • Linux 基础入门
  • 【数据结构】插入排序:直接插入排序、折半插入排序、希尔排序的学习知识总结
  • Magic Battery for Mac:让你的设备电量管理变得轻松简单
  • nodejs+vue大学食堂订餐系统elementui
  • nat综合实验
  • 【iOS逆向与安全】好用的一套 TCP 类
  • Ubuntu Kafka开机自启动服务
  • c#实现单例模式的两种方法(饿汉式、懒汉式)
  • Git与Repo:开源开发的得力工具组合
  • centos7 添加网卡设置动态ip,修改网卡为任意名称
  • 计算机竞赛 深度学习人脸表情识别算法 - opencv python 机器视觉
  • nvm安装后node或npm不是内部或外部命令
  • Kafka数据可靠性保证
  • 基于R的linkET包qcorrplot可视化Mantel test相关性网络热图分析correlation heatmap
  • IOTDB的TsFile底层设计
  • MATLAB算法实战应用案例精讲-【人工智能】边缘计算(补充篇)
  • Linux学习-HIS系统部署(1)