当前位置: 首页 > 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 类型的…...

能耗效率比拼:百川2-13B量化版在OpenClaw长时间任务中的表现

能耗效率比拼&#xff1a;百川2-13B量化版在OpenClaw长时间任务中的表现 1. 测试背景与目标 最近在探索如何用OpenClaw实现个人工作流的自动化时&#xff0c;遇到一个现实问题&#xff1a;当需要长时间运行自动化任务时&#xff0c;本地设备的能耗和稳定性会成为瓶颈。我决定…...

在Ubuntu 20.04上搞定OpenFace:一份保姆级安装与避坑指南(含CEN模型和虚拟显示配置)

在Ubuntu 20.04服务器上部署OpenFace的终极实践指南 当你第一次尝试在无图形界面的Ubuntu服务器上部署OpenFace时&#xff0c;是否遇到过那些令人抓狂的报错信息&#xff1f;从缺失的CEN模型到GTK显示问题&#xff0c;每一步都可能成为阻碍你前进的绊脚石。本文将带你穿越这些技…...

如何通过自动化工具高效获取阴阳师游戏资源?完整实践指南

如何通过自动化工具高效获取阴阳师游戏资源&#xff1f;完整实践指南 【免费下载链接】OnmyojiAutoScript Onmyoji Auto Script | 阴阳师脚本 项目地址: https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript 阴阳师自动化工具是一款功能强大的智能辅助应用&#xff0c…...

Fun-ASR-MLT-Nano-2512快速上手:Web界面操作,无需代码基础

Fun-ASR-MLT-Nano-2512快速上手&#xff1a;Web界面操作&#xff0c;无需代码基础 1. 语音识别新选择&#xff1a;Fun-ASR-MLT-Nano-2512 1.1 模型简介 Fun-ASR-MLT-Nano-2512是阿里通义实验室推出的轻量级多语言语音识别模型&#xff0c;经过开发者by113小贝的二次开发优化…...

Llama-3.2V-11B-cot快速部署:单命令启动+自动加载双卡4090

Llama-3.2V-11B-cot快速部署&#xff1a;单命令启动自动加载双卡4090 1. 项目概述 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B-cot多模态大模型开发的高性能视觉推理工具&#xff0c;专为双卡4090环境深度优化。这个工具解决了传统大模型部署中的几个关键痛点&#xff1a;…...

springboot交通道路监测感知与车路协同系统可视化大屏

目录技术架构设计数据采集与处理可视化大屏功能模块系统集成与部署关键技术点测试与迭代项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作技术架构设计 采用SpringBoot作为后端框架&#xff0c;提供RESTful API接口&#xff1b;…...

viem ABI工具使用教程:编码、解码和类型推断全攻略

viem ABI工具使用教程&#xff1a;编码、解码和类型推断全攻略 【免费下载链接】viem TypeScript Interface for Ethereum 项目地址: https://gitcode.com/gh_mirrors/vi/viem viem是一个轻量级、可组合且类型安全的TypeScript以太坊接口工具库&#xff0c;其强大的ABI工…...

Phi-4-Reasoning-Vision智能助手:医疗影像图文问答系统构建实践

Phi-4-Reasoning-Vision智能助手&#xff1a;医疗影像图文问答系统构建实践 1. 项目概述 Phi-4-Reasoning-Vision是一款基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具&#xff0c;专为医疗影像分析场景优化。该系统能够理解医学影像内容并回答专业问题…...

OpenClaw多通道管理:GLM-4.7-Flash同时对接飞书与钉钉的配置技巧

OpenClaw多通道管理&#xff1a;GLM-4.7-Flash同时对接飞书与钉钉的配置技巧 1. 为什么需要多通道管理&#xff1f; 上周我接到一个技术咨询需求&#xff1a;一个小型内容团队需要同时在飞书和钉钉两个平台上接收AI助手服务。他们的编辑用飞书&#xff0c;运营用钉钉&#xf…...

百度网盘提速全攻略:从限速对抗到效能优化的实战指南

百度网盘提速全攻略&#xff1a;从限速对抗到效能优化的实战指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 诊断限速瓶颈&#xff1a;从协议层破解速度封印 原理图解&am…...