STM32使用LWIP库新建tcp_sever

STM32使用LWIP库新建tcp_sever欢迎查看本文所在的系列 STM32 的 LWIP 应用 点击跳转 main 函数区域 1 是 lwip 的初始化 voidLwIP Init void structip addripaddr structip addrnetmask structip addrgw mem init 内存堆初始化 memp init 内存池初始化 IP4 ADDR

欢迎查看本文所在的系列,STM32的LWIP应用,点击跳转

main函数

STM32使用LWIP库新建tcp_sever

区域1是lwip的初始化
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);//打开网卡 }
区域2
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"); } }
下面讲解tcp_server_accept函数
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; }
备注:
关于 tcp_arg(newpcb, NULL);
我们传入的参数是NULL,为空
但是这个可以不传入空参数,详见官方demo

其中,我们看tcpsever接收函数
/ * @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:

整个lwip协议栈的定时调用功能,这个在本工程中使用的是在主循环中,在大工程中可以放在定时器中,

如果看文字版太枯燥,可以点击看视频版:点击跳转

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232133.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【keras】一维卷积神经网络做回归「建议收藏」

    【keras】一维卷积神经网络做回归「建议收藏」在上一篇博客里我介绍了如何利用keras对一个给定的数据集来完成多分类任务。分类100%的分类准确度验证了分类模型的可行性和数据集的准确度。【keras】一维卷积神经网络多分类在这篇博客当中我将利用一个稍加修改的数据集来完成线性回归任务。相比较以往的线性回归处理方式,我认为使用神经网络实现线性回归要简单和准确得多。数据集大小仍然是247*900,不同的是数据集的第247位变成了湿度特征的真实湿度值。数据集-用做回归.csv不同于分类算法得到的决策面,回归算法得到的是一个最优拟合线,这

    2022年9月22日
    3
  • JavaScript两种数组去重方法「建议收藏」

    JavaScript两种数组去重方法「建议收藏」JavaScript两种数组去重方法第一种(利用splice方法去重)splice()方法用于插入、删除或替换数组的元素。//申明一个数组vararr=[1,3,5,4,3,1,5,7,8,4,7];functiontemp(arr){for(i=0;i<arr.length;i++){for(j…

    2022年6月24日
    28
  • Java语言冒泡排序详解

    Java语言冒泡排序详解基于很多同学在面试的过程中被问到一些基础的算法,导致整个面试过程不理想,而基础的算法和数据结构往往都是一些大公司任职的基本要求,这也严重影响拿offer的成功率。接下来的一段时间我将陆续对一些简单的基础的算法和数据结构进行详细说明。我将从排序算法说起,下面从冒泡排序开始说起。排序结果:数据从小到大。首先说一下冒泡排序的思想:每次比较从第一个数据开始,数据两两比较,如果左边数据比右边数据大,则交换左右

    2022年6月20日
    29
  • net framework 4.0安装失败0x80240037_0x80300001

    net framework 4.0安装失败0x80240037_0x80300001太~不容易了我一定要写个博客。网上的什么dism各种都试过了,都不行后来试了下面这个方法,还是不行,然后死马当活马医重启了一下,没有联网安了一遍,竟然奇迹般地装好了。Cortana中输入服务,回车后查看WindowsUpdate,AppReadiness,CryptographicServices,BackgroundIntelligentTransferService,Win…

    2025年11月3日
    3
  • 配置iptables

    配置iptables

    2021年5月12日
    128
  • 压测工具jmeter怎么使用_并发压力测试工具

    压测工具jmeter怎么使用_并发压力测试工具一、Jmeter下载进入官网:http://jmeter.apache.org/1.第一步进入官网如下图2.选择进行下载,下载下来为一个压缩包,解压即可。3.我下载的是jmeter4.0版本,

    2022年8月2日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号