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工作原理配置双机三层互联(静态路由方式) 交换机工作原理 MAC自学习过程 初始状态: 刚启动的交换机的MAC地址表是空的。 学习过程: 当交换机收到一个数据帧…...
ES(Elasticsearch)常用的函数有哪些?
【电子书大全】内含上千本顶级编程书籍,是程序员必备的电子书资源包,并且会不断地更新,助你在编程的道路上更上一层楼! 链接: https://pan.baidu.com/s/1yhPJ9LmS_z5TdgIgxs9NvQ?pwdyyds > 提取码: yyds Elasticsearch&#x…...
【计算机网络】ICMP报文实验
一:实验目的 1:掌握ICMP报文的各种类型及其代码。 2:掌握ICMP报文的格式。 3:深入理解TTL的含义(Time to Live,生存时间)。 二:实验仪器设备及软件 硬件:RCMS-C服务器…...
transformers进行学习率调整lr_scheduler(warmup)
一、get_scheduler实现warmup 1、warmup基本思想 Warmup(预热)是深度学习训练中的一种技巧,旨在逐步增加学习率以稳定训练过程,特别是在训练的早期阶段。它主要用于防止在训练初期因学习率过大导致的模型参数剧烈波动或不稳定。…...
智能优化算法之灰狼优化算法(GWO)
智能优化算法是一类基于自然界中生物、物理或社会现象的优化技术。这些算法通过模拟自然界中的一些智能行为,如遗传学、蚁群觅食、粒子群体运动等,来解决复杂的优化问题。智能优化算法广泛应用于各种工程和科学领域,因其具有全局搜索能力、鲁…...
昇思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 应用程序而闻名的平台,最近发布了 18.2.0 版本。此更新带来了许多新功能和改进,进一步增强了其功能和开发人员体验。在本文中,我们将深入探讨 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 判断为真,mod(1.11, 0.1) < 0.01判断为假,导致出现意料外的结果。 结果发现…...
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 已经成为容器编排领域的王者,它是基于容器的集群编排引擎,具备扩展集群、滚动升级回滚、弹性伸缩、自动治愈、服务发现等多种特性能力。 本文将带着大家快速了解 kubernetes ,了解我们谈论 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 同时声明多个常量时,如果省略了值则表示和…...
Vue系列面试题
大家好,我是有用就扩散,有用就点赞。 1.Vue中组件间有哪些通信方式? 父子组件通信: (1)props | $emit (接收父组件数据 | 传数据给父组件) (2)ref | $refs&a…...
等级保护 总结2
网络安全等级保护解决方案的主打产品: HiSec Insight安全态势感知系统、 FireHunter6000沙箱、 SecoManager安全控制器、 HiSecEngine USG系列防火墙和HiSecEngine AntiDDoS防御系统。 华为HiSec Insight安全态势感知系统是基于商用大数据平台FusionInsight的A…...
关于Redis(热点数据缓存,分布式锁,缓存安全(穿透,击穿,雪崩));
热点数据缓存: 为了把一些经常访问的数据,放入缓存中以减少对数据库的访问频率。从而减少数据库的压力,提高程序的性能。【内存中存储】成为缓存; 缓存适合存放的数据: 查询频率高且修改频率低 数据安全性低 作为缓存的组件: redis组件 memory组件 e…...
【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第四十七章 字符设备和杂项设备总结回顾
i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…...
C#初级——枚举
枚举 枚举是一组命名整型常量。 enum 枚举名字 { 常量1, 常量2, …… 常量n }; 枚举的常量是由 , 分隔的列表。并且,在这个整型常量列表中,通常默认第一位枚举符号的值为0,此后的枚举符号的值都比前一位大1。 在将枚举赋值给 int 类型的…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...
