郑州市建网站wordpress页面 文章列表

web/2025/9/28 8:06:30/文章来源:
郑州市建网站,wordpress页面 文章列表,wordpress调用当前文章标题,百度网页提交入口在使用esp32 idf例程中的tcp_server和tcp_client通信测试时发现#xff0c; 在tcp_server端#xff0c;接收到一帧数据之后必须马上回复至少一个字节#xff0c;才能保证每帧数据不粘包#xff0c; 如果不回复操作#xff0c;300ms以内的通信时延会导致tcp严重粘包…在使用esp32 idf例程中的tcp_server和tcp_client通信测试时发现 在tcp_server端接收到一帧数据之后必须马上回复至少一个字节才能保证每帧数据不粘包 如果不回复操作300ms以内的通信时延会导致tcp严重粘包后续解析这些数据费时费力 可能跟lwip的回环读写机制有关这严重打乱了双向通信逻辑。 换一种方式使用udp广播来作为数据传输通道使用tcp连接来做状态检测这样就可以 避免粘包问题。 udp广播服务如下 /*** udp服务器高速通信控制器控制命令传输通道(不需要应答的)* */ static void udp_server_task(void *pvParameters) {unsigned char rx_buffer[128];char addr_str[128];int addr_family (int)pvParameters;//ipv4 or ipv6int ip_protocol 0;struct sockaddr_in6 dest_addr;while (1) {if (addr_family AF_INET) {struct sockaddr_in *dest_addr_ip4 (struct sockaddr_in *)dest_addr;/**** 接收广播地址:* 192.168.100.1* 192.168.100.255* 255.255.255.255*/dest_addr_ip4-sin_addr.s_addr htonl(INADDR_ANY);dest_addr_ip4-sin_family AF_INET;dest_addr_ip4-sin_port htons(UDP_SERVER_PORT);ip_protocol IPPROTO_IP;} else if (addr_family AF_INET6) {bzero(dest_addr.sin6_addr.un, sizeof(dest_addr.sin6_addr.un));dest_addr.sin6_family AF_INET6;dest_addr.sin6_port htons(UDP_SERVER_PORT);ip_protocol IPPROTO_IPV6;}global_udpsock_handle socket(addr_family, SOCK_DGRAM, ip_protocol);if (global_udpsock_handle 0) {ESP_LOGE(TAG, Unable to create socket: errno %d, errno);/**因为正在创建的时候网络可能还没有完全连接上不能退出*/vTaskDelay(100 / portTICK_PERIOD_MS);//100mscontinue;}ESP_LOGI(TAG, UDP Socket created);#if defined(CONFIG_LWIP_NETBUF_RECVINFO) !defined(CONFIG_EXAMPLE_IPV6)int enable 1;lwip_setsockopt(sock, IPPROTO_IP, IP_PKTINFO, enable, sizeof(enable)); #endif#if defined(CONFIG_EXAMPLE_IPV4) defined(CONFIG_EXAMPLE_IPV6)if (addr_family AF_INET6) {// Note that by default IPV6 binds to both protocols, it is must be disabled// if both protocols used at the same time (used in CI)int opt 1;setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, opt, sizeof(opt));setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, opt, sizeof(opt));} #endif // // Set timeout 接收广播数据超时时间 // struct timeval timeout; // timeout.tv_sec 10; // timeout.tv_usec 0; // setsockopt (sock, SOL_SOCKET, SO_RCVTIMEO, timeout, sizeof timeout);/*** E (106995) BOT-TAG: Socket unable to bind: errno 112* */int opt 1;setsockopt(global_udpsock_handle, SOL_SOCKET, SO_REUSEADDR, opt, sizeof(opt));int err bind(global_udpsock_handle, (struct sockaddr *)dest_addr, sizeof(dest_addr));if (err 0) {ESP_LOGE(TAG, udp Socket unable to bind: errno %d, errno);close(global_udpsock_handle);/**因为正在创建的时候网络可能还没有完全连接上不能退出*/vTaskDelay(100 / portTICK_PERIOD_MS);//100mscontinue;}ESP_LOGI(TAG, udp Socket bound, port %d,UDP_SERVER_PORT);struct sockaddr_storage source_addr; // Large enough for both IPv4 or IPv6socklen_t socklen sizeof(source_addr);#if defined(CONFIG_LWIP_NETBUF_RECVINFO) !defined(CONFIG_EXAMPLE_IPV6)struct iovec iov;struct msghdr msg;struct cmsghdr *cmsgtmp;u8_t cmsg_buf[CMSG_SPACE(sizeof(struct in_pktinfo))];iov.iov_base rx_buffer;iov.iov_len sizeof(rx_buffer);msg.msg_control cmsg_buf;msg.msg_controllen sizeof(cmsg_buf);msg.msg_flags 0;msg.msg_iov iov;msg.msg_iovlen 1;msg.msg_name (struct sockaddr *)source_addr;msg.msg_namelen socklen; #endifESP_LOGI(TAG, udp start Waiting for data);/*** 重新启动udp server可以清除之前接收的缓存数据防止对下一个连接影响* */while (1) {//tcp没有有效连接则处于睡眠等待状态if(global_tcpsock_handle 0){vTaskDelay(100 / portTICK_PERIOD_MS);//100mscontinue;}#if defined(CONFIG_LWIP_NETBUF_RECVINFO) !defined(CONFIG_EXAMPLE_IPV6)int len recvmsg(global_udpsock_handle, msg, 0); #elseint len recvfrom(global_udpsock_handle, rx_buffer, sizeof(rx_buffer) - 1, 0, (struct sockaddr *)source_addr, socklen); #endif// Error occurred during receivingif (len 0) {ESP_LOGE(TAG, udp recvfrom failed: errno %d, errno);/*** E (615075) BOT-TAG: udp Socket unable to bind: errno 9* *///sock关闭后稍等一下不用立即去创建和bindvTaskDelay(100 / portTICK_PERIOD_MS);break;}// Data receivedelse {// Get the senders ip address as stringif (source_addr.ss_family PF_INET) {inet_ntoa_r(((struct sockaddr_in *)source_addr)-sin_addr, addr_str, sizeof(addr_str) - 1); #if defined(CONFIG_LWIP_NETBUF_RECVINFO) !defined(CONFIG_EXAMPLE_IPV6)for ( cmsgtmp CMSG_FIRSTHDR(msg); cmsgtmp ! NULL; cmsgtmp CMSG_NXTHDR(msg, cmsgtmp) ) {if ( cmsgtmp-cmsg_level IPPROTO_IP cmsgtmp-cmsg_type IP_PKTINFO ) {struct in_pktinfo *pktinfo;pktinfo (struct in_pktinfo*)CMSG_DATA(cmsgtmp);ESP_LOGI(TAG, dest ip: %s\n, inet_ntoa(pktinfo-ipi_addr));}} #endif} else if (source_addr.ss_family PF_INET6) {inet6_ntoa_r(((struct sockaddr_in6 *)source_addr)-sin6_addr, addr_str, sizeof(addr_str) - 1);}//rx_buffer[len] 0; // Null-terminate whatever we received and treat like a string...//ESP_LOGI(TAG, udp Received %d bytes from %s:, len, addr_str);//ESP_LOGI(TAG, %s, rx_buffer);//print0x(rx_buffer,len);cmd_resolve_high_speed(rx_buffer, len);// int err sendto(global_udpsock_handle, rx_buffer, len, 0, (struct sockaddr *)source_addr, sizeof(source_addr)); // if (err 0) { // ESP_LOGE(TAG, Error occurred during sending: errno %d, errno); // break; // }}}// if (global_udpsock_handle ! -1) { // ESP_LOGE(TAG, Shutting down socket and restarting...); // shutdown(global_udpsock_handle, 0); // close(global_udpsock_handle); // }}vTaskDelete(NULL); } tcp状态监听服务如下 /*** tcp服务端,慢速通道处理维护心跳包* */ static void tcp_server_task(void *pvParameters) {char addr_str[128];int addr_family (int)pvParameters;//ipv4 or ipv6int ip_protocol 0;int keepAlive 1;int option 1;int keepIdle KEEPALIVE_IDLE;int keepInterval KEEPALIVE_INTERVAL;int keepCount KEEPALIVE_COUNT;struct sockaddr_storage dest_addr;#ifdef CONFIG_EXAMPLE_IPV4if (addr_family AF_INET) {struct sockaddr_in *dest_addr_ip4 (struct sockaddr_in *)dest_addr;dest_addr_ip4-sin_addr.s_addr htonl(INADDR_ANY);dest_addr_ip4-sin_family AF_INET;dest_addr_ip4-sin_port htons(TCP_SERVER_PORT);ip_protocol IPPROTO_IP;} #endif #ifdef CONFIG_EXAMPLE_IPV6if (addr_family AF_INET6) {struct sockaddr_in6 *dest_addr_ip6 (struct sockaddr_in6 *)dest_addr;bzero(dest_addr_ip6-sin6_addr.un, sizeof(dest_addr_ip6-sin6_addr.un));dest_addr_ip6-sin6_family AF_INET6;dest_addr_ip6-sin6_port htons(PORT);ip_protocol IPPROTO_IPV6;} #endifint listen_sock socket(addr_family, SOCK_STREAM, ip_protocol);if (listen_sock 0) {ESP_LOGE(TAG, Unable to create socket: errno %d, errno);vTaskDelete(NULL);return;}int opt 1;setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, opt, sizeof(opt));#if defined(CONFIG_EXAMPLE_IPV4) defined(CONFIG_EXAMPLE_IPV6)// Note that by default IPV6 binds to both protocols, it is must be disabled// if both protocols used at the same time (used in CI)setsockopt(listen_sock, IPPROTO_IPV6, IPV6_V6ONLY, opt, sizeof(opt)); #endifESP_LOGI(TAG, tcp Socket created);int err bind(listen_sock, (struct sockaddr *)dest_addr, sizeof(dest_addr));if (err ! 0) {ESP_LOGE(TAG, tcp Socket unable to bind: errno %d, errno);ESP_LOGE(TAG, IPPROTO: %d, addr_family);goto CLEAN_UP;}ESP_LOGI(TAG, tcp Socket bound, port %d, TCP_SERVER_PORT);err listen(listen_sock, 1);if (err ! 0) {ESP_LOGE(TAG, Error occurred during listen: errno %d, errno);goto CLEAN_UP;}while (1) {ESP_LOGI(TAG, Socket listening);//建立握手随机数校验标志generate_com_check();hp_check_load();struct sockaddr_storage source_addr; // Large enough for both IPv4 or IPv6socklen_t addr_len sizeof(source_addr);global_tcpsock_handle accept(listen_sock, (struct sockaddr *)source_addr, addr_len);if (global_tcpsock_handle 0) {ESP_LOGE(TAG, Unable to accept connection: errno %d, errno);break;}// Set tcp keepalive optionsetsockopt(global_tcpsock_handle, SOL_SOCKET, SO_KEEPALIVE, keepAlive, sizeof(int));setsockopt(global_tcpsock_handle, IPPROTO_TCP, TCP_KEEPIDLE, keepIdle, sizeof(int));setsockopt(global_tcpsock_handle, IPPROTO_TCP, TCP_KEEPINTVL, keepInterval, sizeof(int));setsockopt(global_tcpsock_handle, IPPROTO_TCP, TCP_KEEPCNT, keepCount, sizeof(int));setsockopt(global_tcpsock_handle, IPPROTO_TCP, TCP_NODELAY, option, sizeof(int));// Convert ip address to string #ifdef CONFIG_EXAMPLE_IPV4if (source_addr.ss_family PF_INET) {inet_ntoa_r(((struct sockaddr_in *)source_addr)-sin_addr, addr_str, sizeof(addr_str) - 1);} #endif #ifdef CONFIG_EXAMPLE_IPV6if (source_addr.ss_family PF_INET6) {inet6_ntoa_r(((struct sockaddr_in6 *)source_addr)-sin6_addr, addr_str, sizeof(addr_str) - 1);} #endifESP_LOGI(TAG, Socket accepted ip address: %s, addr_str);//接收控制器端的下发数据do_tcpsock_recv();//用户主动关闭sockdo_tcpsock_close();do_udpsock_close();}CLEAN_UP:close(listen_sock);vTaskDelete(NULL); }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/83220.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站换行代码上海哪家网站建设公司好

设计原则 封装、继承、多态、抽象分别可以解决哪些编程问题 封装:也叫做信息隐藏或数据保护访问。数据 通过暴露有限的访问接口,授权外部仅能通过类提供接口访问,对内的类private私有化属性,通过封装简化操作,让用户更…

企业做淘宝网站需要多少钱为什么不建议学电子商务?

一、单选 共40题 (共计40分) 第1题 (1.0分) 题号:7098 难度:中 第1章 下列叙述中正确的是 A:一个算法的空间复杂度大,则其时间复杂度也必定大 B:一个算法的空间复杂度大,则其时间复杂度必定小 C:一个…

婚纱网站建设 最开始中油六建公司官网

相关代码gitee自取: C语言学习日记: 加油努力 (gitee.com) 接上期: 学C的第三十四天【程序环境和预处理】_高高的胖子的博客-CSDN博客 1 . 算法效率 (1). 什么是数据结构: 数据结构(Data Structure)是计算机存储、…

邵阳红网站网站整体设计流程

YB4051H 300mA 单电池锂离子电池充电器0.1 mA 终端,45nA 电池漏电流 概述: YB4051系列设备是高度集成的 Li-lon 和 Li-Pol 线性充电器,针对便携式应用的小容量电池。它是一个完整的恒流/恒压线性充电器。不需要外部感应电阻,由于…

民族团结 网站建设平台广告推广

企业想要管理销售,可以选择CRM系统;企业想要优化业务流程,可以选择CRM系统;企业想要提高收入,可以选择CRM系统。下面来说说,CRM是什么?六种常见CRM系统类型对比。 什么是CRM? CRM是…

苏州模板网站专业设计什么是网站推广?

WebBenchmark是一款基于开源通讯组件Beetlex扩展的Webapi管理和性能测试工具,在传统工具中一般管理工具缺乏性能压测能力或有性能测试的缺少管理功能;WebBenchmark的设计目标是就管理和性能压测能力同时具备。接下来介绍一下工具的功能和使用&#xff1a…

商务网站创建方案江苏省住房和城乡建设厅政务网站

导读:在我国,出租车行业是八十年代初兴起的一项新兴行业,随着出租车的产生,计价器也就应运而生。但当时在全国没有一家企业能够生产,因而那个时期的计价器是由台湾引进。台湾是计价器的主要生产场地,目前全…

怎么做网站logo国内在线免费服务器

全世界只有3.14 % 的人关注了数据与算法之美在我的后台咨询者当中,女生向我咨询最多的问题就是:女生转行IT有什么困难?是不是很多IT企业都不要女生啊?女生的逻辑不如男生,是不是学不好编程?等等。1以上的所…

桂林网站设计wordpress 添加头像

作品展示: 背景需求: 1、以前做过一份比大小的题目 【教学类-05-01】20211018 Python VSC 大班 数字比大小(> <)_vsc比较3位数大小-CSDN博客文章浏览阅读674次。【教学类-05-01】20211018 Python VSC 大班…

艺术网站建设哈尔滨网站建设服务

1.包装类 1)包装类为基本数据类型提供了相应的引用数据类型。(基本数据类型-包装类)btye-Byte,char-Character,short-Short,float-Floatint-Integer,double-Double,long-Long,boolean-Boolean 2)通过包装类的构造器来实现吧基本数据类型包装成…

安装网站提示dir互联网开发是什么意思

redis在Windows下设置静默启动 下载windows版redis,解压cmd命令行有窗口启动(这种启动方式,这个界面就不能关闭才会生效 注册成为服务,设置成开机启动或者手动启动(静默启动)清除缓存本地清除,直接打开redis-cli.exe本地远程连接清除缓存 下载…

北京朝阳建站优化广东网页空间租赁

1.2004年,不知道大家对这个时间有没有感觉,那几年我正在读高中,韩寒的《三重门》席卷校园,同样还有郭敬明的《夏至未至》。那时候的我,还挣扎在温饱阶段,我每天吃饭的时候都想上食堂的三楼吃风味&#xff0…

开启WordPress多站点功能上海公司网站制作价格

好文推荐: 2.5万字详解23种设计模式 基于Netty搭建websocket集群实现服务器消息推送 2.5万字讲解DDD领域驱动设计 文章目录 一、延时队列定义二、应用场景三、技术实现方案:1. Redis2. Kafka3. RabbitMQ4. RocketMQ 四、Kafka延时队列背景五、Kafka延时队…

中国建设行业峰会网站建设asp网站视频教程

编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&#xff0c…

江门网站定制多少钱店铺推广策略

response.text() 功能:Sanic 返回纯文本内容给浏览器。作为一个完整功能的web网站,一般是不会返回纯文本内容的,特殊情况下可选择使用本函数。response.text() 语法def text(body,status200, headersNone,content_type"text/plain;chars…

仿京东网站后台外贸seo营销ppt

个人主页:Lei宝啊 愿所有美好如期而遇 前言 本篇文章将会介绍,磁盘中是如何存储一个文件,磁盘中的文件是如何从磁盘中加载进内存,与进程又有怎样的关系,我们写的代码变成可执行程序执行起来时如何完成对文件的一系列…

邹城做网站移动互联网开发平台基于linux安卓

畅想未来儿童画绘画作品大全导语:未来的科技在不断发展,未来的世界每天充满了新奇。下面是小编为您整理的儿童画,希望对您有所帮助。未来的世界是个先进的地方。我们的交通工具不再是飞机、轮船和汽车,而是宇宙飞船。家里的设备是…

域名注册好了怎么做网站新手学做免费网站软件好

官网:http://element-cn.eleme.io/#/zh-CN 转载于:https://www.cnblogs.com/weibanggang/p/9995433.html

镜像站wordpress网络服务代码1001

目录 一、Vite概述 二、Vite构建Vue3工程化项目 三、ViteVue3项目目录结构 四、ViteVue3项目组件(SFC入门) 五、ViteVue3样式导入方式 六、ViteVue3响应式数据和setup语法糖 一、Vite概述 Vite是一种新型前端构建工具,能够显著提升前端开发体验;Vite结合…

天眼查河南建设网站公司wordpress调整固态链接后打不开

Python进行视频图像处理,通过串口发送给stm32,stm32接收数据,刷新OLED进行显示。 步骤: 1.按照接线图连接好硬件 2.把Keil工程的代码下载到STM32中 3.运行Python代码,通过串口把处理后的数据发送给STM32进行显示 …