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)。这对于通过网络发送结构体数据很有帮助,因为你可以直接读取并发送其字节表示。

但是,请注意以下几点:

  1. Pack = 0 可能会导致某些平台或架构上存在不必要的内存对齐填充。通常,你会希望设置一个合适的打包大小(如 Pack = 1),以消除填充并确保最小的二进制表示。

  2. 对于浮点数 float 类型,不同平台和编译器可能会有不同的字节序(大端序或小端序)。在网络传输中,双方需要约定并保持一致的字节序。

  3. 使用这种方法直接将结构体转换为字节流并发送时,接收方必须知道确切的结构体布局和数据类型,以正确地还原原始数据。

以下是如何将此结构体转换为字节流并发送的示例:

// 假设你有一个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方法来直接从内存中解包字节流到结构体。这种方式假定发送和接收端都在同一平台上运行,且字节序相同。如果两端平台或字节序不一致,需要在转换前调整字节序。

另外,对于大规模的通信应用,依然强烈建议使用序列化库来处理这种转换,以简化工作并处理底层细节,包括但不限于字节序、结构体大小和边界检查等问题。

 

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

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

相关文章

vscode开发ESP32问题记录

vscode 开发ESP32问题记录 1. 解决vscode中的波浪线警告 1. 解决vscode中的波浪线警告 参考链接&#xff1a;https://blog.csdn.net/fucingman/article/details/134404485 首先可以通过vscode 中的IDF插件生成模板工程&#xff0c;这样会自动创建.vscode文件夹中的一些json配…

AcWing 787. 归并排序——算法基础课题解

AcWing 787. 归并排序 文章目录 题目描述CGo模板 题目描述 给定你一个长度为 n 的整数数列。 请你使用归并排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行&#xff0c;第一行包含整数 n。 第二行包含 n 个整数&#xff08;所有…

【Week-Y4】修改yolov5s中C3模块的结构,common.py文件解读

修改C3模块的结构 一、commom.py文件解析二、修改代码&#xff0c;运行train.py训练 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 &#x1f4d5;本次任务&#xff1a;将yolov5s网络模型…

自动化运维(四)第一个Ansible任务

AWX和Ansible已经安装好&#xff0c;接下来我们使用一个简单的任务&#xff0c;要学习一下怎么使用这个工具。我们首先准备一下测试环境&#xff0c;我的测试环境共有6台虚拟机&#xff0c;服务器信息如下&#xff1a; Ansible服务器192.168.110.170自动化管理服务器WEB服务器…

交换机特性解析

​1. 端口数量和类型: RJ-45端口: 最常见的端口类型,用于连接网线。 铜缆类型: 超五类、六类、七类等,影响传输速率和距离。 PoE功能: 支持为连接的设备供电,如IP电话、无线AP等。 光纤端口: 用于连接光纤,支持更长的传输距离和更高的速率。 光纤类型: 单模、多模等,影响传…

Python100个库第8个—ftfy(Unicode文本工具)

目录 专栏导读库的介绍安装用法1&#xff1a;ftfy修复文本用法2&#xff1a;修复文本中的特殊字符用法3&#xff1a;修复给定文本片段中的Unicode编码问题和其他字符问题总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手…

【c++20】金山云liuguang引擎

看到大神说liuguang是c++20 开发的下载回来学习下说明文档 liuguang下载源码 zhangbin@DESKTOP-1723CM1 MINGW64 /g/CDN/liuguang-engine $ git clone https://github.com/ksyun-kenc/liuguang Cloning into liuguang... remote: Enumerating objects:

[UTCTF 2024] crypto 部分

RSA-256 RSA签到太简单了 N 77483692467084448965814418730866278616923517800664484047176015901835675610073 e 65537 c 43711206624343807006656378470987868686365943634542525258065694164173101323321 p,q1025252665848145091840062845209085931,755752167715513324…

网易RAG问答知识库开源了,Star 6K!!

网易RAG问答知识库开源了&#xff0c;Star 6K&#xff01;&#xff01; RAG 问答知识库 QAnything 开源了QAnything 架构设计剖析整个架构的工作流程主要包含三个环节为什么需要两阶段检索&#xff1f;使用的基座大模型相关技术组件 QAnything 本地部署一键部署安装&#xff0c…

算法——验证二叉树的前序序列化

题目&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 序列化二叉树的一种方法是使用 前序遍历 。当我们遇到一个非空节点时&#xff0c;我们可以记录下这个节点的值。如果它是一个空节点&#xff0c;我们可以使用一个标记值记录&#xff0c;例如 #。 例如&#xff0c;上…

对HTML语义化的理解

语义化是指根据内容的结构化&#xff08;内容语义化&#xff09;&#xff0c;选择合适的标签&#xff08;代码语义化&#xff09;。通俗来讲就是用正确的标签做正确的事情。 语义化的优点如下&#xff1a; 对机器友好&#xff0c;带有语义的文字表现力丰富&#xff0c;更适合…

【CSS】基础选择器

目录 标签选择器 id选择器 类选择器 CSS的编写地点&#xff1a; 标签选择器 说明&#xff1a;标签选择器实际上就是HTML标签元素&#xff08;可以是任何HTML元素&#xff09;&#xff0c;用来改变一个指定标签的样式 示例&#xff1a; <style type"text/css"…

用vscode仿制小米官网

html内容: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><link rel&quo…

VC++ Windows 平台通过QOS2库函数设置Socket DSCP(IP_TOS)参数选项

本体提供的函数实现&#xff0c;只能对于TCP生效&#xff0c;UDP没法生效&#xff0c;看文档没搞明白&#xff0c;有了解UDP怎么设置DSCP的童鞋&#xff0c;可以在评论区给予答复。 用法是这样的&#xff0c;每个TCP在建立链接后&#xff0c;立即创建这个QOSS的实例&#xff0c…

深入Tauri开发——从环境搭建到项目构建

深入Tauri开发——从环境搭建到项目构建 开启你的Tauri桌面应用开发之旅&#xff08;续&#xff09; 经过上一篇文章的基础介绍&#xff0c;现在让我们更进一步&#xff0c;详细阐述如何在Windows和macOS平台上顺利搭建Tauri应用所需的开发环境&#xff0c;并指导您从创建项目…

vscode前后台分离Nodejs+vue校园影院售票系统_490gq

柚子校园影院在设计与实施时&#xff0c;采取了模块性的设计理念&#xff0c;把相似的系统的功能整合到一个模组中&#xff0c;以增强内部的功能&#xff0c;减少各组件之间的联系&#xff0c;从而达到减少相互影响的目的。 后台主要包括首页&#xff0c;个人中心&#xff0c;用…

Java内存模型(JMM)-happens-before

Java内存模型&#xff08;JMM&#xff09;-happens-before Java内存模型&#xff08;JMM&#xff09;是一种规范&#xff0c;用于定义多线程程序中&#xff0c;线程如何与主内存、工作内存以及其他线程之间进行通信和交互。 其中&#xff0c;happens-before是JMM中的一个重…

Qt 实现的万能采集库( 屏幕/相机/扬声器/麦克风采集)

【写在前面】 之前应公司需要&#xff0c;给公司写过一整套直播的库( 推拉流&#xff0c;编解码)&#xff0c;类似于 libobs。 结果后来因为没有相关项目&#xff0c;便停止开发&维护了。 不过里面很多有用的组件&#xff0c;然后也挺好用的&#xff0c;遂开源出来一部分。…

Java 处理Mysql获取树形的数据

Mysql数据&#xff1a; 代码如下&#xff1a; Entity&#xff1a; Data Accessors(chain true) public class Region {private BigInteger id;//名称private String name;//父idprivate BigInteger parentId;private List<Region> children;private Integer createTim…

clickhouse MPPDB数据库--新特性使用示例

clickhouse 新特性&#xff1a; 从clickhouse 22.3至最新的版本24.3.2.23&#xff0c;clickhouse在快速发展中&#xff0c;每个版本都增加了一些新的特性&#xff0c;在数据写入、查询方面都有性能加速。 本文根据clickhouse blog中的clickhouse release blog中&#xff0c;学…