正点原子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接口。

你可能感兴趣的:(lwIP学习,学习,笔记,udp,stm32,网络协议,websocket)