rt-thread tcp服务器 多客户端连接

2023-05-16

1 tcp 服务端测试

我们从rt-thread 源码中的example 文件夹可以找到一个名为tcpserver.c 的文件, 我们按照官网说明, 添加此文件拖进项目中去, 即可实现tcpserver 测试功能. 参考链接 : stm32f429网络功能配置
或者使用env 工具,添加tcp 服务器测试代码到工程中去
(需要先配置好网络功能, 打开lwip sal 等驱动及其软件包, 具体操作参看board.h 或者官方文档)在这里插入图片描述
添加好tcpserver.c 后, 使用 tcpserver -p 8000 即可开启tcp 服务端, 在测试的过程中发现, 此测试程序仅仅支持单连接, 实际使用中可能会遇到多连接的情况, 所以我通过阅读测试代码发现, 只需要建立连接后,创建一个单独的线程, 用来处理处理不同的客户端即可.

2 tcp 客户端多线程创建

在使用accept 函数后, 可以堵塞等待获取一个客户端连接, 得到连接后的sock 后, 立即创建一个线程, 我在线程传入参数使用了两个参数, 1 客户端序号 0 -8 (设置了最大8个连接), 2 sock 号

void tcp__init(int sock )
{
   rt_thread_t tid;
     char name[10]; 
     struct tcp_c_s *parm = rt_malloc(sizeof(struct tcp_c_s));
     parm->num = g_cnt; // 客户端编号
     parm->sock = sock; // 客户端sock 
   
     if(g_cnt < MAX_CLIENT)
   	{
     rt_sprintf(name,"tcp_%d",g_cnt); 
     tid = rt_thread_create(name, tcp__thread_entry, parm, TCP__THREAD_STACK_SIZE, TCP__THREAD_PRIORITY, TCP__THREAD_TIME);
     if (tid != RT_NULL)
     {
       rt_thread_startup(tid);
     }
     else
     {
       rt_kprintf("tcp_ thread create failed");
     }
   		g_cnt ++; 
     }
   	else
   	{
   	 rt_kprintf("client is too more\r\n");
   	
   	}
}

每次收到一次连接后, 都会创建一个线程, 用来处理当前客户端连接的传输数据
线程的具体内容, 只需要把官方测试代码的while(1) 部分 全盘复制过去即可

2.1 线程循环体

/* 每一个客户端连接线程入口函数 */
static void tcp__thread_entry(void *parameter) //每连接一个创建一个子进程 
{
   struct tcp_c_s *p = (struct tcp_c_s *)parameter;
   struct tcp_c_s tcp_m  ; // 获取当前sock
   tcp_m.num = p->num;
   tcp_m.sock = p->sock; 
   
   int sock = tcp_m.sock; // 获取当前sock 
   //uint8_t num = *num_p;
    fd_set readset, readset_c;
   uint8_t ret; 
   uint8_t *recv_data = rt_malloc(BUFSZ);
   uint16_t bytes_received; 
   struct timeval timeout;
   
     timeout.tv_sec = 3;
   timeout.tv_usec = 0;
   
     rt_kprintf("thread %d, sock %d",tcp_m.num,tcp_m.sock);
    while (1)
       {
   				
           FD_ZERO(&readset_c);
           FD_SET(sock, &readset_c);

           /* Wait for read or write */
           if (select(sock + 1, &readset_c, RT_NULL, RT_NULL, &timeout) == 0)
               continue;

           /* 从connected socket中接收数据,接收buffer是1024大小,但并不一定能够收到1024大小的数据 */
           bytes_received = recv(sock, recv_data, BUFSZ, 0);
           if (bytes_received < 0)
           {
               LOG_E("Received error, close the connect.");
               closesocket(sock);
               sock = -1;
               break;
           }
           else if (bytes_received == 0)
           {
               /* 打印recv函数返回值为0的警告信息 */
               LOG_W("Received warning, recv function return 0.");
               continue;
           }
           else
           {
               /* 有接收到数据,把末端清零 */
               recv_data[bytes_received] = '\0';
               if (strcmp((char *)recv_data, "q") == 0 || strcmp((char *)recv_data, "Q") == 0)
               {
                   /* 如果是首字母是q或Q,关闭这个连接 */
                   LOG_I("Got a 'q' or 'Q', close the connect.");
                   closesocket(sock);
                   sock = -1;
                   break;
               }
               else if (strcmp((char *)recv_data, "exit") == 0)
               {
                   /* 如果接收的是exit,则关闭整个服务端 */
                   closesocket(sock);
                   sock = -1;
                  // goto __exit;
               }
               else
               {
                   /* 在控制终端显示收到的数据 */
   								LOG_D("%d :Received data = %s",tcp_m.num, recv_data);
               }
           }

           /* 发送数据到connected socket */
           ret = send(sock, send_data, rt_strlen(send_data), 0);
           if (ret < 0)
           {
               LOG_E("send error, close the connect.");
               closesocket(sock);
               sock = -1;
               break;
           }
           else if (ret == 0)
           {
               /* 打印send函数返回值为0的警告信息 */
               LOG_W("Send warning, send function return 0.");
           }
       }
   			rt_free(parameter);
}

3 测试

创建线程后, 经过测试, 可以实现多客户端
在这里插入图片描述
6个箭头分别对应 3个客户端连接, 和3个客户端发送的数据

在这里插入图片描述
这是开启了三个tcp 客户端连接单片机上的tcp 服务器

4 遗留的问题和隐患

4.1内存使用

通过创建线程实现了多客户端连接, 但是存在内存使用过大, 每个连接需要创建一个线程, 线程栈大小1KB , 需要创建一个数据接收缓冲区, 目前也是1KB , 如果8个客户端全连, 就需要至少8KB 的额外ram , 可以通过修改最大数目客户端连接个数限制.

4.1 下线检测

原来的测试程序中没有断线检测, 回收资源的操作, 目前也没有进行添加, 如需要稳定运行, 需要考虑进去, 回收线程资源, 关闭已经下线的 socket
这个功能未来我可能会优化一下, 有兴趣的小伙伴可以帮忙提交一下方案

代码链接 : 测试代码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

rt-thread tcp服务器 多客户端连接 的相关文章

  • echarts力导向图区分鼠标点击事件与拖拽事件(angularjs)

    使用echarts的力导向图做了一个知识图谱 xff0c 要求点击节点的时候 xff0c 把节点的数据作为关键词搜索 知识图谱 xff0c 以前没做过 xff0c 也不知道用什么好 xff0c 百度了一下看到有人说用echarts可以做 x
  • 2018前端笔试面试题整理

    最近好几个前端的朋友都在换工作 xff0c 根据她们的面试经验整理了一些前端笔试面试题 毕竟人少 xff0c 面的公司也少 xff0c 所以并不全面 开放性题目 xff1a 1 你在现在的团队处于什么样的角色 xff0c 起到了什么明显的作
  • docker容器网络

    在安装docker时 xff0c 会自动在host主机上创建三个网络 xff0c 用docker network ls可以进行查看 xff1a docker network ls NETWORK ID NAME DRIVER SCOPE b
  • IOS开发入门(11)-导航控制器(1)

    IOS开发入门 xff08 11 xff09 导航控制器I xff1a 层级结构和标签 前言 xff1a xff08 直接从书上抄的 xff09 大多数应用程序是由主视图导出多个屏幕 xff0c 并且通常情况下实现屏幕切换的方法还不止一种
  • IOS开发入门(12)-表视图I:基础知识

    IOS开发入门 xff08 12 xff09 表视图I xff1a 基础知识 在前面几部分中 xff0c 主屏幕只能展示一个汽车对象的信息 而在实际iOS中 xff0c 一次显示多条数据并实现滚动查看是十分常见的 xff0c 例如通讯录 音
  • C语言基础专题 - 头文件引用

    C语言基础专题 头文件引用 jcLee的个人博客 xff1a https blog csdn net qq 28550263 spm 61 1001 2101 3001 5343 邮箱 xff1a 291148484 64 163 com
  • Vue3 配置代理和使用全局axios请求数据

    更详细请参考 xff1a https blog csdn net qq 28550263 article details 120633610 vue3中配置全局代理和使用axios向服务器请求数据 main ts span class to
  • ros(13):ros找不到包报错及解决办法--Config.cmake

    目录 一 基础包 1 1 rospy包 1 2 tf包 1 3 grid map包 1 4 serial 二 专有包 2 1 dynamic reconfigure包 2 2 rosparam handler包 2 3 qt build包
  • 使用Java实现高效的字符串匹配算法

    摘要 xff1a 字符串匹配是计算机领域中的一个重要问题 xff0c 有着广泛的应用场景 在本篇博客文章中 xff0c 我们将介绍几种高效的字符串匹配算法 xff0c 并给出使用Java语言实现的代码示例 xff0c 希望能对读者理解和应用
  • WebDAV是什么

    WebDAV学习及使用 WebDAV是什么WebDEV怎么用各个设备连接1 Window2 MAC WebDAV是什么 基于Web的分布式编写和版本控制 xff08 WebDAV xff09 是超文本传输协议 xff08 HTTP xff0
  • 【计算机基础】整数的补码表示及负整数的左右移

    作者 xff1a LogM 本文原载于 https segmentfault com u logm articles xff0c 不允许转载 文章难免有错误之处 xff0c 请在原文评论处指出 1 补码的表示形式 计算机中整数用补码表示 举
  • Linux 获取内存页大小

    如何查看Linux系统的内存页大小 xff1a 1 getconf PAGESIZE PAGE SIZE 返回值单位为Bytes 点击 此处 折叠或打开 root 64 localhost nginx 1 8 0 getconf PAGES
  • Linux C++服务端开发教程(四) 内存泄露检查

    如何知道内存泄漏 我们如果不去特意查内存泄漏 xff0c 实际上是很难发现的 xff0c 因为这个程序即使发生内存泄漏 xff0c 他也不会有任何特征 泄漏速度不是很快 xff0c 知道某一天 xff0c 我们发现系统运行变慢了 xff0c
  • ubuntu18.04 docker开启2375远程端口

    docker开启2375端口 查询docker服务 查询docker服务 systemctl status docker service 可以看到 docker service 在 etc systemd system 目录下 xff0c
  • 【银河麒麟V10】【服务器】最小化系统安装桌面环境

    1 先制作本地镜像源 本地镜像源搭建方法可参考 xff1a 麒麟V10服务器搭建本地镜像源 https mp csdn net mp blog creation editor 120703047 2 安装桌面环境 yum grouplist
  • 第三方登录之数据库设计

    第三登录之数据库设计 现在很多网站和应用都会接入第三方登录来减少用户注册 xff0c 即方便又快捷 比如说qq登录 xff0c 微信 xff0c 新浪微博等方式 关于第三方登录数据库设计 xff0c 涉及到2张表的设计 xff0c 一张用户
  • 51单片机的定时器/计数器

    7 2 2 定时器 计数器的结构 51单片机的定时器 计数器结构如图7 7所示 T0由特殊功能寄存器TH0 TL0构成 T1由特殊功能寄存器TH1 TL1构成 T0 和T1都具有定时器和计数器两种工作模式 xff0c 4种工作方式 xff0
  • 汇编指令控制单片机LED灯

    一 点亮LED灯 简单的对P1口进行操作就可以了 代码 xff1a ORG 0000H AJMP MAIN ORG 0100H MAIN MOV P1 0FEH 点亮LED1 AJMP MAIN END 二 延时控制流水灯 延时程序生成 x
  • <数据结构> 顺序表

    目录 一 顺序表介绍 二 准备工作 1 创建顺序表 2 初始化顺序表 3 检测是否需要扩容 4 销毁顺序表 5 打印顺序表 三 四大功能 1 增加数据 头插 尾插 指定下标插入 2 删除数据 头删 尾删 指定下标删除 3 查找数据 4 修改
  • Python实现--使用微信定时每天和女友发送定制消息(附代码教程)

    但凡有些事情重复时 xff0c 我就在想怎么可以用程序来自动化 这里想分享如何每天给女友定时微信发送 晚安 xff0c 如果只是晚安 xff0c 就略显单调 xff0c 于是爬取金山词霸每日一句 xff0c 英文和翻译 xff0c 借此设定

随机推荐

  • 容器(ubuntu20.04)开启远程桌面rdp(显示xterm和xclock)(下)

    docker pull chanhyeok sshd ubuntu20 04 root 64 fv az844 904 tmp docker images grep sshd ubuntu20 04 chanhyeok sshd ubunt
  • Python3 函数

    1 函数 1 1函数概念 函数 function 是将具有独立功能的代码块组织成为一个整体 xff0c 使其具有特殊功能的代码集 1 2 函数的作用 使用函数可以加强代码的复用性 xff0c 提高程序编写的效率 1 3 无参数函数语法格式
  • iphone6 修改版本&&iccid解锁

    原创文章 转载请备注 https blog csdn net qq 29173507 article details 104881386 设备 xff1a iphone6卡贴机 IOS12 4 9版本 US SM运营 流程 xff1a 越狱
  • 小米空气净化器2S换pm2.5传感器风扇

    原创文章 转载请备注 https blog csdn net qq 29173507 article details 111466293 设备 小米空气净化器2s 问题 pm2 5的数值显示为0不变 传感器异常 18年年底买了一台净化器 冬
  • vscode插件的使用highlight-words

    highlight words 高亮插件 xff0c 挺好用的 插件管理的搜索框查找并安装该插件即可 插件说明也要看一下哦 原创文章 转载请备注 https blog csdn net qq 29173507 article details
  • c语言程序的编译过程

    操作系统 xff1a ubantu 工具gcc 文件 test c abner 64 DESKTOP M6D2HEN mytest cat test c include lt stdio h gt define MAXC 3 define
  • C语言关键字_record

    重要关键字 涉及流程和单数据类型的关键字 xff0c 功能一般都比较简单 xff0c 在使用过程中很快就会熟悉 下列关键字相对前者来说 xff0c 功能较多 xff0c 值得好好学习 extern 实现外部链接 修饰符extern用在变量或
  • gcc -D选项 宏定义

    用法 Dname 定义宏name 默认定义内容为字符串 1 Dname 61 defn 定义宏name xff0c 并且内容为defn C语言中使用 define来定义宏 xff0c gcc也可以定义宏给源代码使用 不过gcc D选项就简陋
  • 程序员的自我修养--看书总结(更新ing)

    对从事linux平台相关开发的程序员 xff0c 或者是底层编译链接感兴趣的人 xff0c 程序员的自我修养 是很值得看的一本中文书 正如书的副标题 xff0c 链接 装载与库 是主要的内容 挑了书中感兴趣的部分 linux平台相关内容 x
  • 关于C语言中自增和自减运算符的使用及注意事项

    43 43 是自增运算符 xff0c 是单目运算符 xff0c 其作用是使单个变量的值增1 它有两种使用情况 xff1a 1 xff09 前置 xff1a 43 43 i xff0c 先执行i 61 i 43 1 再使用i值 xff1b 2
  • 面试题record

    线程 和 进程 联系和区别 线程的同步和互斥 各种锁的相关信息 死锁的总结要写一下 进程的通讯 进程序的内容空间 xff0c 进程空间相关的内容 编译链接相关知识 C 语言提供了多种预处理功能 xff0c 如宏定义 文件包含 条件编译等 合
  • 解决Debian终端无法正常显示中文的问题

    1 安装locales span class token function apt span span class token function install span locales y 2 添加配置 dpkg reconfigure
  • 使用nano时怎么保存退出的问题

    使用多点机器人X 2平台 xff0c 在ros机器人端 xff0c 对文件进行修改保存时 xff0c 用到nano编辑器 xff0c 修改后保存修改并退出的方法 xff1a 以修改 launch 文件为例 xff1a 打开并修改文件 xff
  • abaqus开发问题

    abaqus使用子程序vs2013和ivf2013一直关联不上 xff0c 怎么破
  • java10进制数和16进制数字相互转换

    1 将java10进制数字转换为16进制 String hex 61 Integer toHexString numb 2 将java 16进制字符转换为10进制数 BigInteger bigint 61 new BigInteger h
  • linux下fcitx部分窗口无效的问题解决

    问题描述 linux下部分窗口切换输入法正常 xff0c 部分窗口切换输入法没有效果 xff0c 无法输入中文 xff0c 使用的是fcitx 问题原因 fcitx未安装好 xff0c 需要再安装fcitx gtk2或者fcitx gtk3
  • 【opencv 学习】使用tesseract-ocr机芯数字识别

    今天学习 tesseract ocr开源库的使用 xff0c 这是个开源的能够识别多语言文字的库 下面是在Windows上安装的步骤 1 xff1a 下载软件 xff0c 选择最新的版本安装 https github com UB Mann
  • 在idea中使用findbugs工具

    目录 一 首先需要在idea内部搜索findbugs工具 xff0c 进行安装 二 自己下载findbugs xff0c 安装到Idea中 xff0c 进行使用 三 find sec bugs安全规则组件的应用 xff0c 在二的步骤中提供
  • linux实现Tomcat的定时重启

    还是吃了能力的亏 xff0c 因为很少写shell脚本 xff0c 导致一个很简单的问题困扰 1 shell脚本 如果不会写的 xff0c 百度下来的脚本 xff0c 单独执行没有任何问题 xff0c 但是一旦通过定时任务去执行的话 xff
  • rt-thread tcp服务器 多客户端连接

    1 tcp 服务端测试 我们从rt thread 源码中的example 文件夹可以找到一个名为tcpserver c 的文件 我们按照官网说明 添加此文件拖进项目中去 即可实现tcpserver 测试功能 参考链接 stm32f429网络