STM32使用LWIP库新建tcp_sever
欢迎查看本文所在的系列,STM32的LWIP应用,点击跳转
main函数
void LwIP_Init(void)
{struct ip_addr ipaddr;struct ip_addr netmask;struct ip_addr gw;mem_init();//内存堆初始化memp_init();//内存池初始化IP4_ADDR(&ipaddr, 192, 168, 16, 211);IP4_ADDR(&netmask, 255, 255 , 255, 0);IP4_ADDR(&gw, 192, 168, 16, 1);netif_add(&netif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, ðernet_input);//添加新网卡到网卡列表netif_set_default(&netif);//将网卡设置为默认网卡netif_set_up(&netif);//打开网卡
}
void tcp_server_init(void)
{/* create new tcp pcb */tcp_server_pcb = tcp_new();//建立一个新的连接标志(pcb),在定义一个tcp_pcb控制块后应该首先被调用,以建立该控制块的连接标志if (tcp_server_pcb != NULL){err_t err;/* bind echo_pcb to port 7 (ECHO protocol) */err = tcp_bind(tcp_server_pcb, IP_ADDR_ANY, 7);//绑定本地的IP地址和端口号,可以将其绑定在一个任意的本地IP地址上,它也只能在函数tcp_new()调用之后才能调用if (err == ERR_OK){/* start tcp listening for echo_pcb */tcp_server_pcb = tcp_listen(tcp_server_pcb);//在绑定成功后,监听端口,在这里监听端口,说明是建立的服务器,与之对应的是tcp_connect,代表的是客户机/* initialize LwIP tcp_accept callback function */tcp_accept(tcp_server_pcb, tcp_server_accept);//接收后调用此函数 ,回调函数,通知LwIP一个新来的连接已经被接收,这其中tcp_server_accept是函数名字,这或许也应该叫回调函数的注册printf("Create TCP server success");printf("\r\nTCP server IP : 192.168.16.211");printf("\r\nTCP server port: 7");printf("\r\n\r\n");}else {printf("Can not bind pcb\n");}}else{printf("Can not create new pcb\n");}
}
static err_t tcp_server_accept(void *arg, struct tcp_pcb *newpcb, err_t err)
{err_t ret_err;/* set priority for the newly accepted tcp connection newpcb */tcp_setprio(newpcb, TCP_PRIO_MIN);//设置这个网络控制块的优先级/* pass newly allocated es structure as argument to newpcb */tcp_arg(newpcb, NULL);//传递一个参数 arg 给后面的调用使用,可以传一个结构体,指定应该传递给所有回调函数的应用程序的具体状态,详见下面的备注/* initialize lwip tcp_recv callback function for newpcb */ tcp_recv(newpcb, tcp_server_recv);//当服务器接收到数据时调用tcp_server_recv函数/* initialize lwip tcp_err callback function for newpcb */tcp_err(newpcb, tcp_server_error);//当服务器出现错误时调用tcp_server_error函数/* initialize lwip tcp_poll callback function for newpcb */tcp_poll(newpcb, tcp_server_poll, 10);//定时调用tcp_server_poll函数,参数10,代表每间隔5s调用,其它看上面区域3的解释/* initialize lwip tcp_sever_sent_ok callback function for newpcb */tcp_sent(newpcb, tcp_sever_sent_ok);//当服务器发送完数据之后调用tcp_sever_sent_ok函数ret_err = ERR_OK;return ret_err;
}
/*** @brief This function is the implementation for tcp_recv LwIP callback* @param arg: pointer on a argument for the tcp_pcb connection* @param tpcb: pointer on the tcp_pcb connection* @param pbuf: pointer on the received pbuf* @param err: error information regarding the reveived pbuf* @retval err_t: error code*/
static err_t tcp_server_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{uint8 *p_data;uint32 data_len;if ((err == ERR_OK) && (p != NULL)){tcp_server_send_back(tpcb, p);printf("TCP server returns the received data\r\n\r\n");pbuf_free(p);}else{if(tpcb->state == CLOSE_WAIT){printf("TCP client downline\r\n");printf("TCP client IP : %d.%d.%d.%d\r\n",(uint8)(tpcb->remote_ip.addr),(uint8)((tpcb->remote_ip.addr)>>8),(uint8)((tpcb->remote_ip.addr)>>16),(uint8)((tpcb->remote_ip.addr)>>24));printf("TCP client port: %d",tpcb->remote_port);printf("\r\n\r\n");tcp_arg(tpcb, NULL);tcp_sent(tpcb, NULL);tcp_recv(tpcb, NULL);tcp_err(tpcb, NULL);tcp_poll(tpcb, NULL, 0);/* close tcp connection */tcp_close(tpcb);}}return ERR_OK;
}
区域3:
如果看文字版太枯燥,可以点击看视频版:点击跳转
STM32使用LWIP库新建tcp_sever相关推荐
- 正点原子STM32(基于HAL库)0
目录 开发环境搭建与使用 常用开发工具简介 MDK 安装 仿真器驱动安装 CH340 USB 虚拟串口驱动安装 使用MDK5 编译例程 使用串口下载程序 使用DAP 下载与调试程序 使用DAP 下载程 ...
- 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(一)
前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 本文 1首先讲解什么是FMC及SDRAM,W9825G6KH芯片原理,2基于CubeMx创建工程 ...
- 【STM32】HAL库 STM32CubeMX教程十四---SPI
前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在我们的HAL库中,对硬件SPI函数做了很好的集成,使得之前SPI几百行代码,在HAL库中,只需 ...
- 【STM32】HAL库 STM32CubeMX教程十一---DMA (串口DMA发送接收)
前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...
- 【STM32】HAL库 STM32CubeMX教程十---DAC
前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...
- 【STM32】HAL库 STM32CubeMX教程九---ADC
前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...
- 配置CLion进行嵌入式STM32的HAL库开发
前言 时不可以苟遇,道不可以虚行. 一.准备 1.软件 CLion-2020:百度网盘提取链接放在文章最后. STM32CubeMX:使用 6.5.0 版本的,不要使用最新版本的 CubeMX,不然没 ...
- 【STM32】标准库与HAL库对照学习教程六--位带操作
[STM32]标准库与HAL库对照学习教程六--位带操作 一.前言 二.准备工作 三.位带介绍 1.位带操作 2.STM32位带及位带别名区域 四.位带区与位带别名区地址转换 五.GPIO的位带操作 ...
- 【STM32】标准库与HAL库对照学习教程八--串口通信详解
[STM32]标准库与HAL库对照学习教程八--串口通信详解 一.前言 二.准备工作 三.通信的基本概念 1.通信方式 2.串行通信与并行通信 (1)串行通信 (2)并行通信 3.异步通信与同步通信 ...
最新文章
- 机器学习笔记八:常见“距离”归纳
- java maven centos7 yum安装
- java内存模型 原子性_Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)...
- Faster-RCNN训练时遇到的问题
- [网络安全自学篇] 十八.XSS跨站脚本攻击原理及代码攻防演示(一)
- Android下强制打开软键盘
- phantomJs原理
- 美团服务体验平台对接业务数据的最佳实践-海盗中间件
- nuxt的asyncdata页面刷新params数据丢失_React navigation goBack方法返回刷新
- 未来 12 个月,哪种编程语言将会流行?
- Java 对象不使用时,为什么要赋值为 null?
- 通向Golang的捷径【3.编辑器,IDE 和其他工具】
- otl连接mysql数据库_C++类库:OTL连接MySQL ODBC数据库(insert, update, select)
- 影片下载观看秘籍大全
- Java实现手机登录功能
- 我们的时空之旅(一)——丽江古城
- 互联网大公司与创业公司
- php打印马赛克,PHP-如何用PHP给一张图生成马赛克效果?
- 专为mac用户设计的苹果手机助手。爱思助手 Mac版结构更清晰,功能更好用,界面更清晰,让你能够轻松查看设备信息,下载最新最火的应用游戏。
- 【ffmpeg】创建AAC编码器
热门文章
- ubuntu双系统时间同步_解决Ubuntu 16.04.6 + Win10 双系统时间错误且不一致问题
- java 线程退出cmd_java 线程的终止与线程中断
- python装饰器记录每一个函数的执行时间
- 创造自己的专属免费网盘:Nextcloud
- 再生龙u盘复制linux,再生龙制作U盘启动盘教程 | 楚盟博客
- 多线程、方便扩展的Windows服务程序
- iview表格嵌套Tooltip
- Docker监控方案之cAdvisor
- 琢越网用户使用手册和反馈
- Spring MVC如何测试Controller(使用springmvc mock测试)