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

C++Socket通讯样例(服务端)

1. 创建Socket实例并开启。

private int OpenTcp(int port, string ip = "")
{//1. 开启服务端try{_tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);IPAddress ipAddr = IPAddress.Any;if (ip != "" && ip != string.Empty){ipAddr = IPAddress.Parse(ip);}_tcpServer.Bind(new IPEndPoint(ipAddr, port));_tcpServer.Listen();_isListening = true;//开启线程Thread listenThread = new Thread(new ThreadStart(AcceptClients));listenThread.Start();}catch (Exception ex){Log.Instance.Error("TcpServer setup fail!\n" + CommonMsg.Space + ex.Message);}return 0;
}

2. 客户端连接——AcceptClients实现。

private void AcceptClients()
{while (_isListening){//单客户端_tcpSocket = _tcpServer.Accept();if (_tcpSocket != null){Thread clientThread = new Thread(SocketReceive);clientThread.Start(_tcpSocket);Log.Instance.Info($"Socket connected!  ( {_tcpSocket.LocalEndPoint} )");}Thread.Sleep(300);}
}

3. 接收客户端信息——SocketReceive实现。

(仅仅将接收的数据放到队列中,不加处理,否则可能耗时而影响通讯接收)

private void SocketReceive(object? obj)
{Socket? tcpClient = (Socket?)obj;if (tcpClient == null) return;//以下代码不放入线程中while (true){if (tcpClient.Connected){int available = tcpClient.Available;if (available > 0){byte[] buffer = new byte[available];int dataSize = tcpClient.Receive(buffer);if (dataSize != available) { MessageBox.Show("Socket received data not equal to available data"); break; }_queueMsgRecv.Enqueue(buffer);}}Thread.Sleep(5);}tcpClient.Close();
}

4. 开启数据处理线程——OpenMsgParseThread

(不断从接收队列中取数据,根据通讯协议进行解析,并处理)

private void OpenMsgParseThread()      
{Task.Run(() =>{while (true){while (_queueMsgRecv.TryDequeue(out byte[]? buffer)){if (buffer != null && buffer.Length > 0){//查询list 中是否存在结束符while (true){List<byte> bufList = buffer.ToList();int flagIdx = bufList.IndexOf(0x04);if (flagIdx == -1){//不存在结束符_msgValid += Encoding.UTF8.GetString(buffer);break;}else{//存在结束符_msgValid += Encoding.UTF8.GetString(buffer.Take(flagIdx).ToArray());buffer = buffer.Skip(flagIdx + 1).Take(buffer.Length - flagIdx - 1).ToArray();try{JObject jObj = JObject.Parse(_msgValid);  //这个地方 如果发来的数据格式有问题,或者不完整,解析会出现异常ProcessRecvMsg(jObj);}catch (Exception ex){Log.Instance.Error("Msg: " + _msgValid);_msgValid = "";byte[] data = LeadlapTool.CreateComnData(MsgToken.TcpDataParseException, null, false, ex.Message);SendMsg(data);continue;}_msgValid = "";continue;}}}}Thread.Sleep(5);}});
}

5. 开启数据发送线程——OpenMsgSendThread

(不断从发送队列取数据,执行发送)

private void OpenMsgSendThread()
{Task.Run(() =>{while (true){if (_tcpSocket.Connected){lock (_locker){bool ret = _queueMsgSend.TryDequeue(out byte[]? data);if (ret && data != null){_tcpSocket.Send(data);}}}Thread.Sleep(10);}});
}

6. 在需要发送数据处执行发送操作——SendMsg

lock (_locker)
{_queueMsgSend.Enqueue(data);
}

7. 关于数据解析

通常需要约定好帧头、帧尾,防止数据丢包、粘包情况。

(1)描述:数据为 byte[],以 0x04 为结束符。

(2)分析:如果数据发送由于阻塞,导致粘包;或者如果发送数据量过大,分好几次才接收完整,导致拆包;

(3)解决:粘包——对数据包解析识别结束符 0x04 并分割,分别解析。

拆包——对数据包叠加,直至识别到结束符 0x04,整合后解析。

(4)数据类型转换。

0x04 作为 byte比较。用 List 的 IndexOf 函数判断,若是-1,则不存在;否则返回 序号。

byte[] --> List: buffer.ToList();

List --> byte[]: bufList.ToArray();

byte[] --> string: Encoding.UTF8.GetString(buffer);

string --> byte[]: Encoding.UTF8.GetBytes(msg);

buffer.Take(flagIdx).ToArray();

相关文章:

C++Socket通讯样例(服务端)

1. 创建Socket实例并开启。 private int OpenTcp(int port, string ip "") {//1. 开启服务端try{_tcpServer new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);IPAddress ipAddr IPAddress.Any;if (ip ! "" && i…...

【学术会议论文投稿】大数据治理:解锁数据价值,引领未来创新

第六届国际科技创新学术交流大会&#xff08;IAECST 2024&#xff09;_艾思科蓝_学术一站式服务平台 更多学术会议请看&#xff1a;https://ais.cn/u/nuyAF3 目录 引言 一、大数据治理的定义 二、大数据治理的重要性 三、大数据治理的核心组件 四、大数据治理的实践案例…...

location中href和replace的区别

1.有两种方式&#xff1a; a、使用 location.href&#xff1a;window.location.href“success.html”; b、使用location.replace&#xff1a;window.location.replace(“new_file.html”); 2.区别是什么&#xff1f; 结果&#xff1a;href相当于打开一个新页面&#xff0c;…...

基于Spring Boot的在线摄影工作室开发指南

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理网上摄影工作室的相关信息成为必然。开发合…...

JDK源码系列(五)—— ConcurrentHashMap + CAS 原理解析

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 ConcurrentHashMap 类 ConcurrentHashMap 1.7 在JDK1.7中ConcurrentHashMap采用了数组分段锁的方式实现。 Segment(分段锁)-减少锁的粒度 ConcurrentHashMap中的分段锁称为Segment&#xff0c;它即类似于…...

技术成神之路:二十三种设计模式(导航页)

设计原则/模式链接面向对象的六大设计原则技术成神之路&#xff1a;面向对象的六大设计原则创建型模式单例模式建造者模式原型模式工厂方法模式抽象工厂模式行为型模式策略模式状态模式责任链模式观察者模式备忘录模式迭代器模式模板方法模式访问者模式中介者模式命令模式解释器…...

Rust编程与项目实战-元组

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 8.2.1 元组的定义 元组是Rust的内置复合数据类型。Rust支持元组&#xff0c;而且元…...

容性串扰和感性串扰

串扰根源在于耦合&#xff0c;电场耦合产生容性耦合电流&#xff0c;磁场耦合产生感性耦合电流 关于容性后向串扰电压与后向串扰系数推导...

windows Terminal 闪退 -- 捣蛋砖家

最近点击Windows 终端总是闪退。 日志提示: 错误应用程序名称: WindowsTerminal.exe&#xff0c;版本: 1.21.2410.17001&#xff0c;时间戳: 0x67118f02 错误模块名称: ucrtbase.dll&#xff0c;版本: 10.0.22621.3593&#xff0c;时间戳: 0x10c46e71 异常代码: 0xc0000409 错…...

java-web-day5

1.spring-boot-web入门 目标: 开始最基本的web应用的构建 使用浏览器访问后端, 后端给浏览器返回HelloController 流程: 1.创建springboot工程, 填写模块信息, 并勾选web开发的相关依赖 注意: 在新版idea中模块创建时java下拉框只能选17, 21, 23 这里选17, maven版本是3.6.3, 很…...

Python | Leetcode Python题解之第508题出现次数最多的子树元素和

题目&#xff1a; 题解&#xff1a; class Solution:def findFrequentTreeSum(self, root: TreeNode) -> List[int]:cnt Counter()def dfs(node: TreeNode) -> int:if node is None:return 0sum node.val dfs(node.left) dfs(node.right)cnt[sum] 1return sumdfs(r…...

Java 分布式缓存

在当今的大规模分布式系统中&#xff0c;缓存技术扮演着至关重要的角色。Java 作为一种广泛应用的编程语言&#xff0c;拥有丰富的工具和框架来实现分布式缓存。本文将深入探讨 Java 分布式缓存的概念、优势、常见技术以及实际应用案例&#xff0c;帮助读者更好地理解和应用这一…...

【MySQL】MySQL 使用全教程

MySQL 使用全教程 介绍 MySQL 是一种广泛使用的开源关系型数据库管理系统(Relational Database Management System)&#xff0c;它基于 Structured Query Language&#xff08;SQL&#xff09;进行数据管理&#xff0c;允许用户存储、检索、更新和删除数据库中的数据。通过提供…...

油猴脚本-GPT问题导航侧边栏增强版

为 GPT官网和相关网站提供了一个便捷的侧边栏目录&#xff0c;能够自动搜集当前会话页面的问题&#xff0c;展示在侧边栏上&#xff0c;可快速导航到问题的位置。 安装使用地址:https://scriptcat.org/zh-CN/script-show-page/1972 安装前请确保浏览器有油猴&#xff0c;没有…...

Java Lock ConditionObject 总结

前言 相关系列 《Java & Lock & 目录》&#xff08;持续更新&#xff09;《Java & Lock & ConditionObject & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Java & Lock & ConditionObject & 总结》&#xff08;学习…...

模块化主动隔振系统市场规模:2023年全球市场规模大约为220.54百万美元

模块化主动隔振系统是一种用于精密设备和实验装置的隔振解决方案&#xff0c;通过主动控制技术消除振动干扰&#xff0c;提供稳定的环境。目前&#xff0c;随着微纳制造和精密测量技术的发展&#xff0c;对隔振系统的要求越来越高。模块化设计使得系统能够灵活适应不同负载和工…...

SpringAOP:对于同一个切入点,不同切面不同通知的执行顺序

目录 1. 问题描述2. 结论结论1&#xff1a;"对于同一个切入点&#xff0c;同一个切面不同类型的通知的执行顺序"结论2&#xff1a;"对于同一个切入点&#xff0c;不同切面不同类型通知的执行顺序" 3. 测试环境&#xff1a;SpringBoot 2.3.4.RELEASE测试集合…...

unique_ptr初始化

std::unique_ptr 是 C11 引入的智能指针&#xff0c;用于管理动态分配的对象的生命周期。unique_ptr 确保每个动态分配的对象有且仅有一个所有者&#xff0c;当 unique_ptr 超出作用域时&#xff0c;它会自动释放其管理的对象。以下是 std::unique_ptr 的一些常见初始化方法。 …...

HelloCTF [RCE-labs] Level 8 - 文件描述和重定向

开启靶场&#xff0c;打开链接&#xff1a; GET传参cmd system($cmd.">/dev/null 2>&1"); 这行代码将执行命令 $cmd&#xff0c;并且将其标准输出和标准错误输出都重定向到 /dev/null&#xff0c;这意味着无论命令的输出还是可能产生的错误信息都不会显示…...

DEVOPS: 集群伸缩原理

概述 阿里云 K8S 集群的一个重要特性&#xff0c;是集群的节点可以动态的增加或减少有了这个特性&#xff0c;集群才能在计算资源不足的情况下扩容新的节点&#xff0c;同时也可以在资源利用 率降低的时候&#xff0c;释放节点以节省费用理解实现原理&#xff0c;在遇到问题的…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...