C#/WinFrom TCP通信+ 网线插拔检测+客服端异常掉线检测

news2024/9/29 1:24:36

Winfor Tcp通信(服务端)

今天给大家讲一下C# 关于Tcp 通信部分,这一块的教程网上一大堆,不过关于掉网,异常断开连接的这部分到是到是没有多少说明,有方法 不过基本上最多的两种方式(1.设置一个超时时间,2.单独整个心跳上报

我觉得那个不好用,所以就给大家分享一下 第三种方式! 就比如 作为 服务端 能够快速的检测到客户端 掉线,然后做处理。

然后说一下 这个篇文章 只讲 服务端的内容,如果想看完整通信 的建议去看看其他的帖子


1.首先是IP地址 :

作为服务端 首先就是需要自己的IP地址,通过下面函数获取到当前主机多个 ID地址,返回一个列表

        /// <summary>
        /// 获取本地的IP地址
        /// </summary>
        /// <returns></returns>
        private List<String> GetLocalIPAddress()
        {
            List<String> AddressIP = new List<string>();
            foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
            {
                if (_IPAddress.AddressFamily.ToString() == "InterNetwork")
                {
                    AddressIP.Add(_IPAddress.ToString());
                }
            }
            return AddressIP;
        }

2.其次就是开启TCP服务

        static bool IsTcpStart_ZX = false;            //判断TCP是否是否开启  开启状态下有效 
        IPEndPoint TcpIpep_ZX = null;                 //连接TCP终端地址
         Socket socketSever_ZX = null;
        /// <summary>
        /// 创建TCP
        /// </summary>
        /// <param name="ipAddrs"></param>        
        /// <param name="port"></param>
        /// <returns></returns>
        private bool creatTcpSever_ZX(string ipAddrs, string port)
        {
            try
            {
                TcpIpep_ZX = new IPEndPoint(IPAddress.Parse(ipAddrs), int.Parse(port)); // 本机IP和监听端口号                
                socketSever_ZX = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socketSever_ZX.Bind(TcpIpep_ZX);
                socketSever_ZX.Listen(1);
                socketSever_ZX.IOControl(IOControlCode.KeepAliveValues, KeepAlive(1, 1000, 1000), null);  //保活时间 用于判断客户端 非正常断开(程序引起的掉线)
                IsTcpStart_ZX = true;
               /* this.Invoke(new Action(() =>
                {
                    toolStripLabel1.Text = "TCP 服务开启成功!";
                }));*/
                threadSever_ZX = new Thread(Listenning_ZX);
                threadSever_ZX.IsBackground = true;
                threadSever_ZX.Start();
                return true;
            }
            catch (Exception)
            {
                return false;
                //toolStripLabel1.Text = "开启错误,请检查IP和端口号!";
            }
        }

		 /// <summary>
        /// 监听函数
        /// </summary>
        private void Listenning_ZX()
        {
            while (IsTcpStart_ZX)
            {
                try
                {
                    Socket linsSocket = socketSever_ZX.Accept();   //;
                    if (ConnectCount_ZX < 1)    //这里做个判断 单设备连接
                    {
                        ConnectCount_ZX++;
                        ClenctSocket_ZX = linsSocket;
                        string client = ClenctSocket_ZX.RemoteEndPoint.ToString();
                        //获取当前 
                        this.Invoke(new Action(() =>
                        {
                            toolStripLabel1.Text = "当前有设备连接:" + client;
                            Set_Textbox_tile_ZX("当前有设备连接:" + client + "  ", Color.Gray);
                        }));
                        Thread thr = new Thread(RecieveMsg_ZX);
                        ThreadList_ZX.Add(thr);
                        thr.IsBackground = true;
                        thr.Start(ClenctSocket_ZX);
                    }
                    else
                    {
                        linsSocket.Close();
                    }
                }
                catch (Exception)
                {
                    throw;
                }
            }
        }


       private byte[] KeepAlive(int onOff, int keepAliveTime, int keepAliveInterval)
        {
            byte[] buffer = new byte[12];
            BitConverter.GetBytes(onOff).CopyTo(buffer, 0);
            BitConverter.GetBytes(keepAliveTime).CopyTo(buffer, 4);
            BitConverter.GetBytes(keepAliveInterval).CopyTo(buffer, 8);
            return buffer;
        }

3. 服务端接受函数


        /// <summary>
        /// 接收函数
        /// </summary>
        /// <param name="socketClient"></param>
        private void RecieveMsg_ZX(object socketClient)
        {
            byte[] arrMsgRec = new byte[1024 * 2];
            StringBuilder builder = new StringBuilder();
            StringBuilder TestBuilder = new StringBuilder();
            Socket scketClient = socketClient as Socket;
            while (IsTcpStart_ZX)
            {
                int length = -1;
                try
                {
                    if (scketClient.Poll(-1, SelectMode.SelectRead))   //判断socket是否掉线
                    {
                        int nRead = scketClient.Receive(arrMsgRec, SocketFlags.Peek);
                        if (nRead == 0)
                        {

                            this.Invoke(new Action(() =>
                            {
                                Set_Textbox_tile_ZX("客服端:" + scketClient.RemoteEndPoint.ToString() + "断开连接   ", Color.Gray);
                            }));
                            ClenctSocket_ZX = null;
                            ConnectCount_ZX = 0;
                            return;
                        }
                        length = scketClient.Receive(arrMsgRec);
                    }
                }
                catch (Exception)
                {
                }

以上就是基本的程序,上面我大概写下,网上教程很多参考下就行了

主要我讲讲这个这个TCP 作为主机 从机掉线这一块

-------首先说说 下面这个方法,如下图所示下面是他的方法说明,这是一个关于Socket的一个状态轮询的函数 这里我们轮询的是接受状态 SelectMode.SelectRead ,就是如下图所说如果 返回结果为 false 则连接处于 已关闭、重置、或者终止状态,前面的参数是等待响应,这里我们就直接触发就行。这个方法能有效检测链路层断线等情况

if (scketClient.Poll(-1, SelectMode.SelectRead)) //判断socket是否掉线
在这里插入图片描述
在这里插入图片描述


还有就是下面这个方法:

socketSever.IOControl(IOControlCode.KeepAliveValues, KeepAlive(1, 1000, 1000), null);
官方API说明 =================》
网友参考资料1
大家可以参考下! 反正意思基本就发布包 保证连接双方通信正常,不正常时做处理。

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

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

相关文章

Python爬虫技术 第13节 HTML和CSS选择器

在爬虫技术中&#xff0c;解析和提取网页数据是核心部分。HTML 和 CSS 选择器被广泛用于定位网页中的特定元素。下面将详细介绍这些选择器如何在 Python 中使用&#xff0c;特别是在使用像 Beautiful Soup 或 Scrapy 这样的库时。 HTML 选择器 HTML 选择器基于 HTML 元素的属性…

Llama 3.1和xAI超集群加速AI军备竞赛

LLama 3.1 先来看看LLama 3.1 405B的效果&#xff0c;例如输入生成上海印象的四连图&#xff0c;然后一键再生成短视频&#xff0c;整体还是可圈可点。 从下面的各项基准而言&#xff0c;LLama3.1系列在同等量级中均有不俗的表现&#xff0c;尤其是405B已经和闭源的GPT-4o不分…

内网横向:PTHPTKPTT

1.PHT横向 2.PTK横向 3.PTT横向 1.PHT横向&#xff1a; 条件&#xff1a;有管理员的NTLM Hash 并且目标机器开 放445端口 在工作组环境中&#xff1a; Windows Vista 之前的机器&#xff0c;可以使用本地管理员组内用户进行攻击。 WindowsVista 之后的机器&#xff0c;只能是…

【iOS】—— Block总结

Block总结 1. Block的使用规范2. __block修饰符__block修饰符的底层原理 3. Block的类型NSGlobalBlockNSStackBlockNSMallocBlock 4. Block的实现及本质初始化部分调用部分本质 5. Block的捕获与内存管理捕获变量捕获对象内存管理 6. 循环引用什么是循环引用循环引用解决方法1.…

抓包工具Charles

1、抓包的目的 遇到问题需要进行分析 发现bug需要定位 检查数据传输的安全性 接口测试时&#xff0c;开发给的需求文档不详细 在弱网环境下APP的测试 2、Charles是java语言编写的程序&#xff0c;本质是一个代理服务器&#xff0c;通过拦截服务端和客户端的http请求&#xff0…

谷粒商城实战笔记-63-商品服务-API-品牌管理-OSS获取服务端签名

文章目录 一&#xff0c;创建第三方服务模块thrid-party1&#xff0c;创建一个名为gulimall-third-party的模块2&#xff0c;nacos上创建third-party命名空间&#xff0c;用来管理这个服务的所有配置3&#xff0c;配置pom文件4&#xff0c;配置文件5&#xff0c;单元测试6&…

西瓜视频下载助手,支持批量下载视频!

我们每天都在接触海量的视频内容&#xff0c;但想要保存自己喜爱的视频却常常受限于平台的各种限制。因此&#xff0c;今天给大家带来一个超级实用的神器——西瓜视频下载助手。 西瓜视频下载助手&#xff08;电脑&#xff09; 工具支持西瓜视频的下载和今日头条的视频下载&a…

kafka详解及应用场景介绍

Kafka架构 Kafka架构&#xff0c;由多个组件组成&#xff0c;如下图所示&#xff1a; 主要会包含&#xff1a;Topic、生产者、消费者、消费组等组件。 服务代理&#xff08;Broker&#xff09; Broker是Kafka集群中的一个节点&#xff0c;每个节点都是一个独立的Kafka服务器…

如何使用EXCEL访问WinCC中的实时数据实现报表

如果项目已经做好了&#xff0c;不想改动现有项目。那么可以使用 EXCEL 通过 OPC 方式访问 WinCC 项目的数据。预先定义好 EXCEL 表格样式&#xff0c;通过以下方式实现。通过以下步骤打开 EXCEL 中的 VB 编辑器 引用 WinCC 提供的 OPC 客户端 Control 控件: Siemens OPC DAAut…

Godot游戏制作 04平台设计

新建创景&#xff0c;添加AnimatableBody2D节点。 添加Sprite2D节点 拖动图片 剪裁图片&#xff0c;吸附模式&#xff1a;像素吸附 添加CollisionShape2D&#xff0c;设置实际形状为矩形 重命名AnimatableBody2D节点为Platform&#xff0c;保存场景&#xff0c;拖动platform场景…

VirtualBox 安装Centos 7 避坑指南 SSH连不上 镜像失效 静态网络配置等

背景 几乎每次安装Centos 7 时&#xff0c;都会遇到各种各样的问题&#xff0c;毕竟每次安装动辄就是半年几年&#xff0c;几乎都是在换工作时&#xff0c;有了新机器才会倒腾一次&#xff0c;时间久远&#xff0c;就会忘记一些细节&#xff0c;这次整理一下&#xff0c;避免以…

数字图像处理笔记(三) ---- 傅里叶变换的基本原理

系列文章目录 数字图像处理笔记&#xff08;一&#xff09;---- 图像数字化与显示 数字图像处理笔记&#xff08;二&#xff09;---- 像素加图像统计特征 数字图像处理笔记&#xff08;三) ---- 傅里叶变换的基本原理 文章目录 系列文章目录前言一、傅里叶变换二、离散傅里叶变…

Vue3与Element-plus配合 直接修改表格中的一项数据——控制输入框的显示与隐藏

利用控制与隐藏输入框,直接修改表格中的每一项数据。 <!-- 表格模块 --> <div><el-table :data"tablelist" style"width: 100%"><el-table-column align"center" prop"deposit" label"接单押金">&l…

【动态规划】力扣.213. 打家劫舍 II

你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 &#xff0c;这意味着第一个房屋和最后一个房屋是紧挨着的。同时&#xff0c;相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一…

自动驾驶汽车普及之路

全球范围内自动驾驶汽车的普及正在加速。英国最近通过了 自动驾驶汽车法案 以便在未来几年内实现全自动驾驶和部分自动驾驶汽车安全融入社会。 更多自动驾驶汽车 目前&#xff0c;中国是世界上测试自动驾驶出租车最多的国家。而在美国&#xff0c;各大城市已将“自动驾驶出租车…

人工智能历史:从梦想到现实的变革之路

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

python机器学习8--自然语言处理(2)

1&#xff0e;移除用词 在很多情况下&#xff0c;有一些文章内的英文字符、标点符号分词的结果不符合自己的预期&#xff0c;会出现一些不想要的分词&#xff0c;此时就能通过以下的函数自己设定用词&#xff0c;并且删除。 jieba.analyse.set_stop_words("stop_words.tx…

哈默纳科HarmonicDrive谐波减速机的使用寿命计算

在机械传动系统中&#xff0c;减速机的应用无处不在&#xff0c;而HarmonicDrive哈默纳科谐波减速机以其独特的优势&#xff0c;如轻量、小型、传动效率高、减速范围广、精度高等特点&#xff0c;成为了众多领域的选择。然而&#xff0c;任何机械设备都有其使用寿命&#xff0c…

第五周:机器学习笔记

第五周学习周报 摘要Abstract机器学习——神经网络训练不起来怎么办&#xff1f;1. 局部最小点和鞍点1.1 Momentum(动量)1.2 Local minima和saddle point谁出现的情况更多&#xff1f; 2. 批次&#xff08;Batch&#xff09;2.1 Small Batch v.s. Large Batch Pytorch学习——T…

python项目通过docker部署到Linux系统并实现远程访问

背景需求&#xff1a;在Windows系统编写了简单的python代码&#xff0c;希望能通过docker打包到Linux Ubuntu系统中&#xff0c;并运行起来&#xff0c;并且希望在本地Windows系统中能通过postman访问。 目录 一、原本的python代码 二、创建一个简单的Flask应用程序 三、创…