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

TCP服务器主动断开客户端

自定义消息函数

afx_msg LRESULT CbaseMFCprojectDlg::OnOnsocketbartender(WPARAM wParam, LPARAM lParam)
WPARAM wParam:消息来源
res = recv(wParam, cs, 65535, 0);获取这个客户端端口socket通道里面的信息长度为65535存放在cs里面
如果获取得到res==0即是说明该客户端已经断开了与服务器的连接,服务器需要主动关闭此连接
closesocket(wParam);关闭这一消息通道的函数

afx_msg LRESULT CbaseMFCprojectDlg::OnOnsocketbartender(WPARAM wParam, LPARAM lParam)
{CString str("");char cs[65535] = "";char cs2[65535] = "";char cs3[65535] = "";char cs4[65535] = "";char cs5[65535] = "";char cs6[65535] = "";char cs7[65535] = "";char cs8[65535] = "";char cs9[65535] = "";char cs10[65535] = "";//char cs11[65535] = "";//char cs12[65535] = "";//char cs13[65535] = "";//char cs14[65535] = "";//char cs15[65535] = "";//char cs16[65535] = "";//char cs17[65535] = "";//char cs18[65535] = "";//char cs19[65535] = "";//char cs20[65535] = "";switch (lParam){case FD_ACCEPT://连接请求{int length = sizeof(m_addrServerBack_Bartender);//接收客户端的请求m_ServerSocketBack_Bartender = accept(m_ServerSocket_Bartender, (sockaddr*)&m_addrServerBack_Bartender, &length);m_wParamsBartender.emplace_back(m_ServerSocketBack_Bartender);SetTimer(2, 2000, NULL);}break;case FD_READ://发送数据请求{//CString num = "";CString num("");CString num2("");CString num3("");CString num4("");CString num5("");//CString num6("");//CString num7("");//CString num8("");//CString num9("");CString num10("");//CString num11("");//CString num12("");//CString num13("");//CString num14("");//CString num15("");//CString num16("");//CString num17("");//CString num18("");//CString num19("");//CString num20("");//CString temp;//temp = m_recvupcomputer;int res;res = recv(wParam, cs, 65535, 0);//最大读取int类型65535长度的内容res = recv(wParam, cs2, 65535, 0);//res返回为0表示客户端已经断开连接,为大于1的数则表示成功读取,为-1则表示有连接但读取失败res = recv(wParam, cs3, 65535, 0);res = recv(wParam, cs4, 65535, 0);res = recv(wParam, cs5, 65535, 0);//res = recv(wParam, cs6, 65535, 0);//res = recv(wParam, cs7, 65535, 0);//res = recv(wParam, cs8, 65535, 0);//res = recv(wParam, cs9, 65535, 0);res = recv(wParam, cs10, 65535, 0);//res = recv(wParam, cs11, 65535, 0);//res = recv(wParam, cs12, 65535, 0);//res = recv(wParam, cs13, 65535, 0);//res = recv(wParam, cs14, 65535, 0);//res = recv(wParam, cs15, 65535, 0);//res = recv(wParam, cs16, 65535, 0);//res = recv(wParam, cs17, 65535, 0);//res = recv(wParam, cs18, 65535, 0);//res = recv(wParam, cs19, 65535, 0);//res = recv(wParam, cs20, 65535, 0);num = cs;num2 = cs2;num3 = cs3;num4 = cs4;num5 = cs5;//num6 = cs6;//num7 = cs7;//num8 = cs8;//num9 = cs9;num10 = cs10;//num11 = cs11;//num12 = cs12;//num13 = cs13;//num14 = cs14;//num15 = cs15;//num16 = cs16;//num17 = cs17;//num18 = cs18;//num19 = cs19;//num20 = cs20;if (res == 0 && num.GetLength() == 0) {closesocket(wParam);//客户端已经断开连接,服务器这边需要释放掉这个客户端writeShowLog2(_T("bartender正常断开"));writeErrorLog("bartender正常断开");//if (m_recvzpls.size() == m_parameters_fileds[0].at("connom_tagnum").ivalue * 2) {//	::PostMessage(theMainDlg->m_hWnd, WM_SOCKET_CLIENT_PLC, 0, 2);//激活自发打印事件//}if (m_printResultSend > 0) {KillTimer(4);m_printResultSend = 0;JsonmesSend jms;jms.code = "0";jms.mcuIndex = "1";jms.businessType = "printResult";std::string bostr = "";jms.bo = bostr;MesServerSend(jms);}for (int i = 0; i < m_wParamsBartender.size(); i++) {if (wParam == m_wParamsBartender[i]) {m_wParamsBartender.erase(m_wParamsBartender.begin() + i);//在vector中erase掉这个客户端break;}}break;if (m_wParamsBartender.size() <= 0) {KillTimer(2);}}CString stateStr;//CString recv;stateStr.Format(_T("收到Bartender%s"), num);//recv += num;//m_recvupcomputer = temp;m_recvBartender += num;if (num2.GetLength() > 0) {m_recvBartender += num2;stateStr += num2;}if (num3.GetLength() > 0) {m_recvBartender += num3;stateStr += num3;}if (num4.GetLength() > 0) {m_recvBartender += num4;stateStr += num4;}if (num5.GetLength() > 0) {m_recvBartender += num5;stateStr += num5;}//if (num6.GetLength() > 0) {//	m_recvBartender += num6;//	stateStr += num6;//}//if (num7.GetLength() > 0) {//	m_recvBartender += num7;//	stateStr += num7;//}//if (num8.GetLength() > 0) {//	m_recvBartender += num8;//	stateStr += num8;//}//if (num9.GetLength() > 0) {//	m_recvBartender += num9;//	stateStr += num9;//}if (num10.GetLength() > 0) {m_recvBartender += num10;stateStr += num10;if (num10.GetLength() > 60000) {writeShowLog(_T("传输过长请处理,bartender"));writeErrorLog("传输过长请处理,bartender");}}//if (num20.GetLength() > 0) {//	m_recvBartender += num20;//	stateStr += num20;//	if (num20.GetLength() > 60000) {//		writeShowLog(_T("传输过长请处理,bartender"));//		writeErrorLog("传输过长请处理,bartender");//	}//}//{"number":-1}//if (m_upcomputerstatus == 0) {if (num.GetLength() > 0) {//说明有接收长度std::string log = (CW2A)stateStr;writeErrorLog(log);CString findstart2, findend2;findstart2 = _T("^XA");findend2 = _T("^XZ");//重新寻找重定位s2,e2int s2 = m_recvBartender.Find(findstart2);int e2 = m_recvBartender.Find(findend2);if (s2 >= 0) {//closesocket(m_ServerSocketBack_Bartender);//m_wParam = wParam;//SetTimer(2, 2000, NULL);m_upcomputerstatus = 2;if (e2 > 0) {m_upcomputerstatus = 0;CString recvzpl;recvzpl = m_recvBartender.Mid(s2, e2 - s2 + findend2.GetLength());m_recvzpls.emplace_back(recvzpl);m_recvBartender = m_recvBartender.Right(m_recvBartender.GetLength() - e2 - findend2.GetLength());//重新寻找重定位s2,e2s2 = m_recvBartender.Find(findstart2);e2 = m_recvBartender.Find(findend2);while (s2 >= 0) {if (e2 < 0) {break;}recvzpl = m_recvBartender.Mid(s2, e2 - s2 + findend2.GetLength());m_recvzpls.emplace_back(recvzpl);m_recvBartender = m_recvBartender.Right(m_recvBartender.GetLength() - e2 - findend2.GetLength());//重新寻找重定位s2,e2s2 = m_recvBartender.Find(findstart2);e2 = m_recvBartender.Find(findend2);};if (s2 < 0) {m_recvBartender = m_recvBartender.Right(m_recvBartender.GetLength() < findstart2.GetLength() ? m_recvBartender.GetLength() : findstart2.GetLength());}//if (m_recvzpls.size() == m_parameters_fileds[0].at("connom_tagnum").ivalue * 2) {if (m_recvzpls.size() > 0) {if (m_printerSendTimes == 0) {::PostMessage(theMainDlg->m_hWnd, WM_SOCKET_CLIENT_PLC, 0, 2);//激活自发打印事件}}if (m_recvzpls.size() == m_parameters_fileds[0].at("connom_tagnum").ivalue * 2) {//if (m_recvzpls.size() >0) {{closesocket(wParam);//完整接受zpl自动断开连接,服务器这边需要释放掉这个客户端writeShowLog2(_T("bartender正常自动断开"));writeErrorLog("bartender正常自动断开");if (m_printResultSend > 0) {KillTimer(4);m_printResultSend = 0;JsonmesSend jms;jms.code = "0";jms.mcuIndex = "1";jms.businessType = "printResult";std::string bostr = "";jms.bo = bostr;MesServerSend(jms);}for (int i = 0; i < m_wParamsBartender.size(); i++) {if (wParam == m_wParamsBartender[i]) {m_wParamsBartender.erase(m_wParamsBartender.begin() + i);//在vector中erase掉这个客户端break;}}break;if (m_wParamsBartender.size() <= 0) {KillTimer(2);}}}else if (m_recvzpls.size() > m_parameters_fileds[0].at("connom_tagnum").ivalue * 2) {writeShowLog2(_T("bartenderZPL超限"));writeErrorLog("bartenderZPL超限");}}}else {if (e2 >= 0) {writeShowLog2(_T("zpl错误"));m_recvBartender = _T("");}}CString show;show.Format(_T("zpl个数:%d"), m_recvzpls.size());writeShowLog2(show);log = (CW2A)show;writeErrorLog(log);}}break;}return 0;
}

相关文章:

TCP服务器主动断开客户端

自定义消息函数 afx_msg LRESULT CbaseMFCprojectDlg::OnOnsocketbartender(WPARAM wParam, LPARAM lParam) WPARAM wParam:消息来源 res recv(wParam, cs, 65535, 0);获取这个客户端端口socket通道里面的信息长度为65535存放在cs里面 如果获取得到res0即是说明该客户端已经断…...

接口自动化中json.dumps()跟json.loads()区别详解

接口自动化中对于参数处理经常会用到json.dumps()跟json.loads(),下面主要分享一下自己使用总结 1.主要区别 json.dumps() 用于将字典转换为字符串格式 json.loads()用于将字符串转换为字典格式 import jsondict1 {"name":"amy","gender":woma…...

计算机网络-配置双机三层互联(静态路由方式)

目录 交换机工作原理路由器工作原理路由信息表组成部分路由器发决策 ARP工作原理配置双机三层互联&#xff08;静态路由方式&#xff09; 交换机工作原理 MAC自学习过程 初始状态&#xff1a; 刚启动的交换机的MAC地址表是空的。 学习过程&#xff1a; 当交换机收到一个数据帧…...

ES(Elasticsearch)常用的函数有哪些?

【电子书大全】内含上千本顶级编程书籍&#xff0c;是程序员必备的电子书资源包&#xff0c;并且会不断地更新&#xff0c;助你在编程的道路上更上一层楼&#xff01; 链接: https://pan.baidu.com/s/1yhPJ9LmS_z5TdgIgxs9NvQ?pwdyyds > 提取码: yyds Elasticsearch&#x…...

【计算机网络】ICMP报文实验

一&#xff1a;实验目的 1&#xff1a;掌握ICMP报文的各种类型及其代码。 2&#xff1a;掌握ICMP报文的格式。 3&#xff1a;深入理解TTL的含义&#xff08;Time to Live&#xff0c;生存时间&#xff09;。 二&#xff1a;实验仪器设备及软件 硬件&#xff1a;RCMS-C服务器…...

transformers进行学习率调整lr_scheduler(warmup)

一、get_scheduler实现warmup 1、warmup基本思想 Warmup&#xff08;预热&#xff09;是深度学习训练中的一种技巧&#xff0c;旨在逐步增加学习率以稳定训练过程&#xff0c;特别是在训练的早期阶段。它主要用于防止在训练初期因学习率过大导致的模型参数剧烈波动或不稳定。…...

智能优化算法之灰狼优化算法(GWO)

智能优化算法是一类基于自然界中生物、物理或社会现象的优化技术。这些算法通过模拟自然界中的一些智能行为&#xff0c;如遗传学、蚁群觅食、粒子群体运动等&#xff0c;来解决复杂的优化问题。智能优化算法广泛应用于各种工程和科学领域&#xff0c;因其具有全局搜索能力、鲁…...

昇思25天学习打卡营第17天|计算机视觉

昇思25天学习打卡营第17天 文章目录 昇思25天学习打卡营第17天ShuffleNet图像分类ShuffleNet网络介绍模型架构Pointwise Group ConvolutionChannel ShuffleShuffleNet模块构建ShuffleNet网络 模型训练和评估训练集准备与加载模型训练模型评估模型预测 打卡记录 ShuffleNet图像分…...

Windows图形界面(GUI)-MFC-C/C++ - 键鼠操作

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 MFC鼠标 派发流程 鼠标消息(客户区) 鼠标消息(非客户) 坐标处理 客户区 非客户 坐标转换 示例代码 MFC键盘 击键消息 虚拟键代码 键状态 MFC鼠标 派发流程 消息捕获&#…...

Angular 18.2.0 的新功能增强和创新

一.Angular 增强功能 Angular 是一个以支持开发强大的 Web 应用程序而闻名的平台&#xff0c;最近发布了 18.2.0 版本。此更新带来了许多新功能和改进&#xff0c;进一步增强了其功能和开发人员体验。在本文中&#xff0c;我们将深入探讨 Angular 18.2.0 为开发人员社区提供的…...

matlab 小数取余 rem 和 mod有 bug

目录 前言Matlab取余函数1 mod 函数1.1 命令行输入1.2 命令行输出 2 rem 函数2.1 命令行输入2.2 命令行输出 分析原因注意 前言 在 Matlab 代码中mod(0.11, 0.1) < 0.01 判断为真&#xff0c;mod(1.11, 0.1) < 0.01判断为假&#xff0c;导致出现意料外的结果。 结果发现…...

Avalonia中的数据模板

文章目录 1. 介绍和概述什么是数据模板:数据模板的用途:2. 定义数据模板在XAML中定义数据模板:在代码中定义数据模板:3. 使用数据模板在控件中使用数据模板:数据模板选择器:定义数据模板选择器:在XAML中使用数据模板选择器:4. 复杂数据模板使用嵌套数据模板:使用模板绑…...

Sqlmap中文使用手册 - Techniques模块参数使用

目录 1. Techniques模块的帮助文档2. 各个参数的介绍2.1 --techniqueTECH2.2 --time-secTIMESEC2.3 --union-colsUCOLS2.4 --union-charUCHAR2.5 --union-fromUFROM2.6 --dns-domainDNS2.7 --second-urlSEC2.8 --second-reqSEC 1. Techniques模块的帮助文档 Techniques:These o…...

科普文:kubernets原理

kubernetes 已经成为容器编排领域的王者&#xff0c;它是基于容器的集群编排引擎&#xff0c;具备扩展集群、滚动升级回滚、弹性伸缩、自动治愈、服务发现等多种特性能力。 本文将带着大家快速了解 kubernetes &#xff0c;了解我们谈论 kubernetes 都是在谈论什么。 一、背…...

GO-学习-02-常量

常量是不变的 const package main import "fmt"func main() {//常量定义时必须赋值const pi 3.1415926const e 2.718//一次声明多个常量const(a 1b 2c "ihan")const(n1 100n2n3)//n2,n3也是100 同时声明多个常量时&#xff0c;如果省略了值则表示和…...

Vue系列面试题

大家好&#xff0c;我是有用就扩散&#xff0c;有用就点赞。 1.Vue中组件间有哪些通信方式&#xff1f; 父子组件通信&#xff1a; &#xff08;1&#xff09;props | $emit &#xff08;接收父组件数据 | 传数据给父组件&#xff09; &#xff08;2&#xff09;ref | $refs&a…...

等级保护 总结2

网络安全等级保护解决方案的主打产品&#xff1a; HiSec Insight安全态势感知系统、 FireHunter6000沙箱、 SecoManager安全控制器、 HiSecEngine USG系列防火墙和HiSecEngine AntiDDoS防御系统。 华为HiSec Insight安全态势感知系统是基于商用大数据平台FusionInsight的A…...

关于Redis(热点数据缓存,分布式锁,缓存安全(穿透,击穿,雪崩));

热点数据缓存: 为了把一些经常访问的数据&#xff0c;放入缓存中以减少对数据库的访问频率。从而减少数据库的压力&#xff0c;提高程序的性能。【内存中存储】成为缓存; 缓存适合存放的数据: 查询频率高且修改频率低 数据安全性低 作为缓存的组件: redis组件 memory组件 e…...

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第四十七章 字符设备和杂项设备总结回顾

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…...

C#初级——枚举

枚举 枚举是一组命名整型常量。 enum 枚举名字 { 常量1, 常量2, …… 常量n }; 枚举的常量是由 , 分隔的列表。并且&#xff0c;在这个整型常量列表中&#xff0c;通常默认第一位枚举符号的值为0&#xff0c;此后的枚举符号的值都比前一位大1。 在将枚举赋值给 int 类型的…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...