C# Socket发送、接收结构体
Socket发送:Socket的使用
一、Socket发送结构体
结构体如下:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct OutPoint_ST
{public int LeftheartX;public int LeftHeartY;public float WidthHeart;public int RightHeartX;public int RightHeartY;public int ChestX;public int ChestY;public float WidthChest;
}
结构体已经使用了 [StructLayout(LayoutKind.Sequential, Pack = 0)] 特性,这意味着它的字段按照声明顺序进行内存布局,并且没有填充字节(Pack=0)。这对于通过网络发送结构体数据很有帮助,因为你可以直接读取并发送其字节表示。
但是,请注意以下几点:
-
Pack = 0可能会导致某些平台或架构上存在不必要的内存对齐填充。通常,你会希望设置一个合适的打包大小(如Pack = 1),以消除填充并确保最小的二进制表示。 -
对于浮点数
float类型,不同平台和编译器可能会有不同的字节序(大端序或小端序)。在网络传输中,双方需要约定并保持一致的字节序。 -
使用这种方法直接将结构体转换为字节流并发送时,接收方必须知道确切的结构体布局和数据类型,以正确地还原原始数据。
以下是如何将此结构体转换为字节流并发送的示例:
// 假设你有一个OutPoint_ST实例
OutPoint_ST point = new OutPoint_ST() {...};// 将结构体转换为字节数组
byte[] buffer = System.BitConverter.GetBytes(point.LeftheartX).Concat(System.BitConverter.GetBytes(point.LeftHeartY)).Concat(System.BitConverter.GetBytes(point.WidthHeart)).Concat(System.BitConverter.GetBytes(point.RightHeartX)).Concat(System.BitConverter.GetBytes(point.RightHeartY)).Concat(System.BitConverter.GetBytes(point.ChestX)).Concat(System.BitConverter.GetBytes(point.ChestY)).Concat(System.BitConverter.GetBytes(point.WidthChest)).ToArray();// 发送数据
Socket socket = ... // 获取已连接的Socket实例
socket.Send(buffer);
二、Socket接收结构体
在接收方,需要做相反的操作来解析接收到的字节数组到结构体。
以下是如何在接收端实现这一过程的一个基本示例:
首先,确保接收端已经从Socket接收到完整的结构体字节数组,可以通过循环接收直到达到预期的字节数量。假设你已经将完整结构体的字节数组接收到了byte[] receivedBytes中,并且知道结构体的大小(即所有字段总字节数)。
// 假设你已经接收到了正确的字节数组
byte[] receivedBytes = ... // 从Socket接收的完整结构体字节数组// 创建一个临时缓冲区来存储结构体
var sizeOfStruct = Marshal.SizeOf<OutPoint_ST>(); // 获取结构体大小
if (receivedBytes.Length < sizeOfStruct)
{throw new ArgumentException("Received bytes do not contain a full structure.");
}OutPoint_ST receivedPoint;// 将字节数组复制到结构体中
using (var pinnedBuffer = GCHandle.Alloc(receivedBytes, GCHandleType.Pinned))
{// 转换为结构体指针var pointer = pinnedBuffer.AddrOfPinnedObject();// 直接从字节缓冲区读取到结构体中receivedPoint = (OutPoint_ST)Marshal.PtrToStructure(pointer, typeof(OutPoint_ST));
}// 现在receivedPoint包含了从字节流解析出来的结构体数据
上述代码使用了Marshal.PtrToStructure方法来直接从内存中解包字节流到结构体。这种方式假定发送和接收端都在同一平台上运行,且字节序相同。如果两端平台或字节序不一致,需要在转换前调整字节序。
另外,对于大规模的通信应用,依然强烈建议使用序列化库来处理这种转换,以简化工作并处理底层细节,包括但不限于字节序、结构体大小和边界检查等问题。
相关文章:
C# Socket发送、接收结构体
Socket发送:Socket的使用 一、Socket发送结构体 结构体如下: [StructLayout(LayoutKind.Sequential, Pack 1)] public struct OutPoint_ST {public int LeftheartX;public int LeftHeartY;public float WidthHeart;public int RightHeartX;public in…...
ics-05-攻防世界
题目 点了半天只有设备维护中心能进去 御剑扫一下 找到一个css 没什么用 再点击云平台设备维护中心url发生了变化 设备维护中心http://61.147.171.105:65103/index.php?pageindex试一下php伪协议 php://filter/readconvert.base64-encode/resourceindex.php base64解一下…...
Web API(三)之事件流事件委托其他事件
Web API(三)之事件流&事件委托&其他事件 事件流捕获和冒泡事件捕获事件冒泡阻止冒泡解绑事件两种注册事件的区别事件委托其他事件页面加载事件元素滚动事件页面滚动事件-获取位置页面滚动事件-滚动到指定的坐标页面尺寸事件元素尺寸与位置元素尺寸与位置-尺寸...
SSL证书的作用是什么?
SSL证书让网站和用户之间安全传输信息,就像给网络对话加了一把密码锁。它主要做四件事: 1. 证明身份: - 像警察局一样,有个叫“证书颁发机构”的家伙负责检查网站是不是真的。网站要向它证明自己是谁(比如,…...
皮具5G智能制造工厂数字孪生可视化平台,推进企业数字化转型
皮具5G智能制造工厂数字孪生可视化平台,推进企业数字化转型。随着信息技术的快速发展,数字化转型已成为企业提升竞争力、实现可持续发展的关键路径。皮具行业,作为一个传统的手工制造业,正面临着巨大的市场变革和技术挑战。如何在…...
RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之Port模块配置详解(MCAL配置)
Port模块配置详解 前言一、如何添加Port模块?1.1 导入Port模块二、Port模块详细配置说明2.1 Port模块问题解决2.2 Port模块配置步骤2.2.1 数据手册查找Port对应的Group2.2.2 配置Port为CAN功能2.2.3 选择芯片型号总结前言 我们还差一个Port模块进行配置io的复用功能选择。就是…...
多叉树题目:子树中标签相同的结点数
文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题:子树中标签相同的结点数 出处:1519. 子树中标签相同的结点数 难度 5 级 题目描述 要求 给你一个树(即一个连通的无向无环图…...
帝国CMS模板源码整站安装说明(图文)
安装步骤 第一步:先把得到的文件解压缩,把文件通过FTP传到空间里。(请不要把类似www.lengleng.net这个文件夹传到FTP,请传这个大文件夹下面的所有文件夹和文件到空间根目录,请不要上传到2级目录,除非你自己…...
物联网系统未来的发展趋势
一、引言 物联网系统作为新一代的信息技术,正在逐渐改变我们的生活和工作方式。随着物联网技术的不断发展和应用场景的拓展,未来物联网系统的发展趋势将更加明显。本文将从技术、应用、安全等方面探讨物联网系统未来的发展趋势。 二、技术发展趋势 1.…...
基于支持 GPT 的服务的初创公司
Kafkai:多语言长篇内容生成,AI写作的新趋势 介绍 随着生成式预训练 Transformer (GPT) 的出现,技术世界正在见证范式转变。 这种人工智能驱动的创新不仅仅是一种转瞬即逝的趋势,而是一种趋势。 它已成为科技行业的基石,…...
基于springboot实现教师人事档案管理系统项目【项目源码+论文说明】
基于springboot实现IT技术交流和分享平台系统演示 摘要 我国科学技术的不断发展,计算机的应用日渐成熟,其强大的功能给人们留下深刻的印象,它已经应用到了人类社会的各个层次的领域,发挥着重要的不可替换的作用。信息管理作为计算…...
上行上传rsync+inotify
引言 使用inotify通知接口,可以用来监控文件系统的各种变化情况,如文件存取、删除、移动、修改等。利用这一机制,可以非常方便地实现文件异动告警、增量备份,并针对目录或文件的变化及时作出响应。 将inotify机制与rsync工具相结合…...
借助ChatGPT写作:打造学术论文中的亮点与互动
ChatGPT无限次数:点击直达 打造学术论文中的亮点与互动 引言 学术论文是学术界交流思想、探讨问题和展示研究成果的重要形式。如何使学术论文在众多作品中脱颖而出,吸引读者的眼球并激发互动,是每位研究者都关注的问题。本文将介绍如何借助ChatGPT这一…...
逐步学习Go-sync.Mutex(详解与实战)
概述 Go中提供了互斥锁:sync.Mutex。sync.Mutex提供了以下方法: type Mutex // 加锁。如果已经有goroutine持有了锁,那么就阻塞等待直到持有锁 func (m *Mutex) Lock()// 尝试加锁。如果加锁成功就返回true,否则返回失败 func (m…...
每日三道面试题之 Java并发编程 (一)
1.为什么要使用并发编程 并发编程是一种允许多个操作同时进行的编程技术,这种技术在现代软件开发中非常重要,原因如下: 充分利用多核处理器:现代计算机通常都拥有多核处理器,通过并发编程,可以让每个核心独…...
车身稳定控制系统原理是什么?
车身稳定控制系统(Electronic Stability Control,ESC)是一种先进的车辆动态控制系统,其主要原理是通过传感器监测车辆的各项状态,包括车速、转向角度、侧倾角等,然后通过电子控制单元(ECU&#…...
vue3前端加载动画 lottie-web 的简单使用案例
什么是 Lottie Lottie 是 Airbnb 发布的一款开源动画库,它适用于 Android、iOS、Web 和 Windows 的库。 它提供了一套从设计师使用 AE(Adobe After Effects)到各端开发者实现动画的工具流。 UED 提供动画 json 文件即可, 开发者就…...
基于java+springboot+vue实现的健身房管理系统(文末源码+Lw)23-223
摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装健身房管理系统软件来发挥其高效地信息处理的作用…...
10款白嫖党必备的ai写作神器,你都知道吗? #媒体#人工智能#其他
从事自媒体运营光靠自己手动操作效率是非常低的,想要提高运营效率就必须要学会合理的使用一些辅助工具。下面小编就跟大家分享一些自媒体常用的辅助工具,觉得有用的朋友可以收藏分享。 1.飞鸟写作 这是一个微信公众号 面向专业写作领域的ai写作工具&am…...
Docker工作流
1.工作流 开发应用编写Dockerfile构建Docker镜像运行Docker容器测试应用发布镜像到Hub迭代更新镜像 2.开发应用 首先你需要创建一个应用,这个应用可以是后端应用或者前端应用,任何语言都可以。 比如:我使用IDEA 创建一个Java后端应用&…...
接cst-matlab自动化建模,cst天线/超表面数据集自动化计算和收集,提供建模代码
接cst-matlab自动化建模,cst天线/超表面数据集自动化计算和收集,提供建模代码,提供数据集数据CST和MATLAB这对组合最近被我玩出花了。搞天线设计的朋友应该都懂,手动建模调参简直是精神折磨——尤其是超表面这种动辄几十个单元的结…...
MAX17043电量计驱动开发:嵌入式电池管理实战指南
1. MAX17043 电量计库深度解析:面向嵌入式工程师的底层驱动开发指南1.1 芯片级功能定位与工程价值MAX17043 是 Maxim Integrated(现为 Analog Devices)推出的高精度单节锂离子/锂聚合物电池电量计 IC,采用 12 引脚 TDFN 封装&…...
Go语言的网络编程:从TCP到WebSocket
Go语言的网络编程:从TCP到WebSocket 网络编程的重要性 在现代软件开发中,网络编程是一项基本技能。通过网络编程,我们可以: 构建客户端-服务器应用程序实现分布式系统开发 Web 应用和 API实现实时通信功能与其他服务进行集成 Go 语…...
Speechless:为你的微博记忆穿上PDF保护衣
Speechless:为你的微博记忆穿上PDF保护衣 【免费下载链接】Speechless 把新浪微博的内容,导出成 PDF 文件进行备份的 Chrome Extension。 项目地址: https://gitcode.com/gh_mirrors/sp/Speechless 在数字记忆碎片化的时代,你是否曾担…...
Python 实战:数据归一化 4 种核心方法对比 + 代码实现(机器学习必看)
在机器学习、深度学习的数据预处理中,数据归一化是绕不开的关键步骤。不同特征往往量纲不同(比如年龄 18-60、收入 1000-100000),直接训练模型会导致:梯度下降收敛慢、难以最优解距离类算法(KNN、K-Means、…...
解密Abaqus许可证“心跳”机制与合理超时时间设置
解密Abaqus许可证“心跳”机制跟合理超时时间设置你是不单是也碰到过这种情况:Abaqus许可证明明用不了,可系统还在继续计费?我在一家制造企业做许可证优化,就碰到了此老问题。为何许可证会“死掉”?这跟许可证的心跳&a…...
英语祈使句结构
英语祈使句:极简结构 + 直白例句(一看就懂) 核心: 主语一律省略(默认 You 你 / 你们),直接用动词开头,用来命令 / 请求 / 禁止 一、基础核心结构(3 种万能模板) 1 肯定祈使句(直接让做某事) 结构:动词原形 + 其他成分(宾语 / 状语) 例句: Open the door.…...
利用快马AI快速构建picoclaw机器人控制器驱动原型
今天想和大家分享一个用InsCode(快马)平台快速搭建picoclaw机器人控制器原型的有趣经历。picoclaw是一款很酷的微型控制器,能直接驱动电机和读取传感器,特别适合做小型机器人项目。但每次从零开始写驱动代码总让人头疼,这次尝试用AI辅助开发&…...
封不住!Claude Code爆改Python版加冕最快10万星,且clone且珍惜
Jay 发自 凹非寺量子位 | 公众号 QbitAI还活着!两天过去,Claude Code源码克隆项目不仅健在,还成了史上最快10万星项目。太恐怖了,揽星速度比之前的OpenClaw还要猛,火到连作者的妈妈都出来喊话,催他赶紧去申…...
实战应用指南:基于快马平台开发养龙虾产销一体化管理平台
今天想和大家分享一个最近用InsCode(快马)平台做的养龙虾产销管理系统的开发经历。作为一个养殖户出身的技术爱好者,我深知传统养殖业在数字化管理上的痛点,这次尝试用低代码方式解决实际问题,效果出乎意料的好。 系统设计思路 整个平台围绕四…...
