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

Lwip之TCP服务端示例记录(1对1)

示例

//
// Created by shchl on 2024/3/8.
//
#if  1#include <string.h>
#include "lwip/api.h"
#include "FreeRTOS.h"
#include "task.h"
#include "usart.h"
#include "lwip_comm.h"static TaskHandle_t tcp_server; /*任务句柄*/
static void tcp_server_entity(void *args);void netconn_tcp_server_create_thread() {xTaskCreate((TaskFunction_t) tcp_server_entity,"tcp_server",256,NULL,10,&tcp_server);}#define TCP_SERVER_RX_BUFSIZE 1500
static struct netconn *conn;
static struct netconn *client_conn;/*客户端连接*/
static uint8_t remot_addr[4] = {0}; /*远端ip数组*/
static u16_t port;/*远端端口*/
static ip_addr_t ipaddr;/*远端ip*/
static u8_t tcp_server_recvbuf[TCP_SERVER_RX_BUFSIZE] = {0};static void tcp_server_entity(void *args) {err_t err;conn = netconn_new(NETCONN_TCP);  //创建一个TCP链接netconn_bind(conn, IP_ADDR_ANY, 8080);  //绑定端口 8号端口netconn_listen(conn);        //进入监听模式conn->recv_timeout = 10;    //禁止阻塞线程 等待10msstruct netbuf *recvbuf;u32_t data_len = 0;while (1) {handle_listen_tag:err = netconn_accept(conn, &client_conn);  //接收连接请求if (err == ERR_OK) {client_conn->recv_timeout = 10;netconn_getaddr(client_conn, &ipaddr, &port, 0); //获取远端IP地址和端口号remot_addr[3] = (uint8_t) (ipaddr.addr >> 24);remot_addr[2] = (uint8_t) (ipaddr.addr >> 16);remot_addr[1] = (uint8_t) (ipaddr.addr >> 8);remot_addr[0] = (uint8_t) (ipaddr.addr);printf("主机%d.%d.%d.%d连接上服务器,主机端口号为:%d\r\n",remot_addr[0], remot_addr[1], remot_addr[2], remot_addr[3], port);handle_client_tag:/*处理客户端请求*/err = netconn_recv(client_conn, &recvbuf);switch (err) {case ERR_OK: {portDISABLE_INTERRUPTS();memset(tcp_server_recvbuf, 0, TCP_SERVER_RX_BUFSIZE);  //数据接收缓冲区清零for (struct pbuf *q = recvbuf->p; q != NULL; q = q->next)  //遍历完整个pbuf链表{if (q->len > (TCP_SERVER_RX_BUFSIZE - data_len)) {/*数据超出缓冲区大小*/memcpy(tcp_server_recvbuf + data_len, q->payload, TCP_SERVER_RX_BUFSIZE - data_len);break;} else {memcpy(tcp_server_recvbuf + data_len, q->payload, q->len);}data_len += q->len;if (data_len > TCP_SERVER_RX_BUFSIZE) break;}portENABLE_INTERRUPTS();// todo 应用逻辑处理USART1_Transmits(tcp_server_recvbuf, data_len);data_len = 0;  //复制完成后data_len要清零。netbuf_delete(recvbuf);break;}case ERR_CLSD:case ERR_RST: {printf("主机:%d.%d.%d.%d断开与服务器的连接\r\n", remot_addr[0], remot_addr[1], remot_addr[2],remot_addr[3]);goto release_conn_tag;}default:if (g_lwipdev.link_status == LWIP_LINK_OFF) { /*判断网线是否连接正常*/printf("物理连线出现问题\r\n");goto release_conn_tag;}break;}goto handle_client_tag;release_conn_tag: /*释放链接*/{netconn_close(client_conn);netconn_delete(client_conn);goto handle_listen_tag;}}vTaskDelay(1000);}
}#endif

相关文章:

  • RHEL9 DNF/YUM仓库管理软件包
  • 【More Effective C++】条款24:了解虚函数的成本
  • day16_购物车(添加购物车,购物车列表查询,删除购物车商品,更新选中商品状态,完成购物车商品的全选,清空购物车)
  • springboot单体项目链路日志跟踪及接口耗时
  • Sklearn线性回归
  • WebSocket:实现客户端与服务器实时通信的技术
  • 考研复习C语言初阶(4)+标记和BFS展开的扫雷游戏
  • 嵌入式学习37-TCP并发模型
  • 铅酸充电器开关电源设计
  • k8s-生产级的k8s高可用(2) 25
  • 目标检测数据集:手机顶盖焊缺陷检测数据集
  • Midjourney绘图欣赏系列(十一)
  • 美团2025春招第一次笔试题
  • GIS之深度学习10:运行Faster RCNN算法
  • window.postMessage学习(问答式)
  • 【个人向】《HTTP图解》阅后小结
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • HTTP中GET与POST的区别 99%的错误认识
  • input的行数自动增减
  • Java基本数据类型之Number
  • MobX
  • Mysql优化
  • oschina
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Spring Boot MyBatis配置多种数据库
  • 百度地图API标注+时间轴组件
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 将 Measurements 和 Units 应用到物理学
  • 数据可视化之 Sankey 桑基图的实现
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 王永庆:技术创新改变教育未来
  • 国内开源镜像站点
  • 积累各种好的链接
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ​马来语翻译中文去哪比较好?
  • # 透过事物看本质的能力怎么培养?
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • ###STL(标准模板库)
  • #if 1...#endif
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (1)Android开发优化---------UI优化
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (九)c52学习之旅-定时器
  • (转) Face-Resources
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @hook扩展分析
  • [1]-基于图搜索的路径规划基础
  • [17]JAVAEE-HTTP协议
  • [51nod1610]路径计数
  • [android] 天气app布局练习