热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

STM32F4DISCO学习之LWIPTCP学习

2015年12月9日BY:TATERLITCP比UDP就复杂多了,UDP就像串口一样发发随便奶奶,但是TCP不是,有监听啊,查询啊什么,可以看看电脑的TCP连接,多得呢.所以,

 

2015年12月9日 BY : TATERLI

TCP比UDP就复杂多了,UDP就像串口一样发发随便奶奶,但是TCP不是,有监听啊,查询啊什么,可以看看电脑的TCP连接,多得呢.

所以,在官方的例子你们,TCP Client就是6个函数:

 

static err_t tcp_echoclient_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err);
static void tcp_echoclient_connection_close(struct tcp_pcb *tpcb, struct echoclient * es);
static err_t tcp_echoclient_poll(void *arg, struct tcp_pcb *tpcb);
static err_t tcp_echoclient_sent(void *arg, struct tcp_pcb *tpcb, u16_t len);
static void tcp_echoclient_send(struct tcp_pcb *tpcb, struct echoclient * es);
static err_t tcp_echoclient_connected(void *arg, struct tcp_pcb *tpcb, err_t err);

 而TCP Server则有7个那么多.

 

 

static err_t tcp_echoserver_accept(void *arg, struct tcp_pcb *newpcb, err_t err);
static err_t tcp_echoserver_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err);
static void tcp_echoserver_error(void *arg, err_t err);
static err_t tcp_echoserver_poll(void *arg, struct tcp_pcb *tpcb);
static err_t tcp_echoserver_sent(void *arg, struct tcp_pcb *tpcb, u16_t len);
static void tcp_echoserver_send(struct tcp_pcb *tpcb, struct tcp_echoserver_struct *es);
static void tcp_echoserver_connection_close(struct tcp_pcb *tpcb, struct tcp_echoserver_struct *es);

形象地说,TCP模拟成一个教室的通信,而TCP Server时候,你就是老师,而TCP Client时候,你就是学生,老师可以接受很多学生提问,也可以给单独一个学生说话,也可以群体发话,学生之间不能之间聊天,只能跟老师说话.TCP Server和TCP Client可以共存在一个板子上,他们端口肯定是不一样的.如果是TCP Server,老师,只要知道课室是哪个,就能找到学生,而学生要找老师,就得跟着老师去了哪个课室,这样,是不是挺好理解的.

我们用官方的例子,但是进行一些分析.首先是创建一个老师啊.

void tcp_echoserver_init(void)
{tcp_echoserver_pcb = tcp_new();if (tcp_echoserver_pcb != NULL){err_t err;err = tcp_bind(tcp_echoserver_pcb, IP_ADDR_ANY, 7); /* TCP绑定 */if (err == ERR_OK){tcp_echoserver_pcb = tcp_listen(tcp_echoserver_pcb); /* 开始监听(等学生来) */tcp_accept(tcp_echoserver_pcb, tcp_echoserver_accept); /* 如果有什么动静,需要通知我,这个函数. */}}
}

 然后再生成回调:

 

 

static err_t tcp_echoserver_accept(void *arg, struct tcp_pcb *newpcb, err_t err)
{  if (es != NULL) {    /* 当收到数据时  */   tcp_recv(newpcb, tcp_echoserver_recv);    /* 当出错时  */    tcp_err(newpcb, tcp_echoserver_error);    /* 当轮询时 */    tcp_poll(newpcb, tcp_echoserver_poll, 1);    ret_err = ERR_OK;  }
}

 

对于收到数据的处理方法:

 

static err_t tcp_echoserver_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{/* 空TCP数据 */if (p == NULL){ret_err = ERR_OK;}/* 非空但是数据不正确 */else if(err != ERR_OK){ret_err = err;}/* 连接成功 */else if(es->state == ES_ACCEPTED){ret_err = ERR_OK;}/* 收到数据 */else if (es->state == ES_RECEIVED){ret_err = ERR_OK;}/* 连接关闭后还能收到数据 */else{ret_err = ERR_OK;}return ret_err;
}

 然后这个其实只需要tcp_echoserver_init,后续就一切可以了.一直监听,如果有数据,就会进入处理流程.

MCU作为TCP服务器

如果我们作为Client,就不断的发送新数据给老师(服务器).所以要知道老师的地址.所以,连接时候不一样,其他逻辑基本一样.

 

void tcp_echoclient_connect(void){  struct ip_addr DestIPaddr;  /* create new tcp pcb */  echoclient_pcb = tcp_new();  if (echoclient_pcb != NULL)  {    IP4_ADDR( &DestIPaddr, DEST_IP_ADDR0, DEST_IP_ADDR1, DEST_IP_ADDR2, DEST_IP_ADDR3 );    /* connect to destination address/port */    tcp_connect(echoclient_pcb,&DestIPaddr,DEST_PORT,tcp_echoclient_connected);  }  else  {    /* deallocate the pcb */    memp_free(MEMP_TCP_PCB, echoclient_pcb);#ifdef SERIAL_DEBUG    printf("\r can not create tcp pcb");#endif  }}

 其他都是一样的,那么,对于TCP的高级应用,TCP Web,就没什么难度了,就不多说了.例程:

DP83848以太网测试_TCP传输


推荐阅读
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • 利用 Python Socket 实现 ICMP 协议下的网络通信
    在计算机网络课程的2.1实验中,学生需要通过Python Socket编程实现一种基于ICMP协议的网络通信功能。与操作系统自带的Ping命令类似,该实验要求学生开发一个简化的、非标准的ICMP通信程序,以加深对ICMP协议及其在网络通信中的应用的理解。通过这一实验,学生将掌握如何使用Python Socket库来构建和解析ICMP数据包,并实现基本的网络探测功能。 ... [详细]
  • 本文介绍了如何在 Spring Boot 项目中使用 spring-boot-starter-quartz 组件实现定时任务,并将 cron 表达式存储在数据库中,以便动态调整任务执行频率。 ... [详细]
  • 普通树(每个节点可以有任意数量的子节点)级序遍历 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 本文详细介绍如何使用Netzob工具逆向未知通信协议,涵盖从基本安装到高级模糊测试的全过程。通过实例演示,帮助读者掌握Netzob的核心功能。 ... [详细]
  • Docker 环境下 MySQL 双主同步配置指南
    本文介绍了如何在 Docker 环境中配置 MySQL 的双主同步,包括目录结构的创建、配置文件的编写、容器的创建与设置以及最终的验证步骤。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 本文详细介绍了如何使用Python中的smtplib库来发送带有附件的邮件,并提供了完整的代码示例。作者:多测师_王sir,时间:2020年5月20日 17:24,微信:15367499889,公司:上海多测师信息有限公司。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
author-avatar
我爱投资理财
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有