C# Socket发送、接收结构体数组

C# Socket发送、接收结构体-CSDN博客

 

C# Socket发送、接收结构体数组按以下步骤操作:

一、Socket发送结构体数组

定义结构体数组

首先,根据给定的结构体定义,创建一个结构体数组实例。

[StructLayout(LayoutKind.Sequential, Pack = 0)]
public struct ST_BonefractureInfo
{
    public int nID;
    public float fScore;
    public int nLTX;
    public int nLTY;
    public int nRBX;
    public int nRBY;
}

// 创建结构体数组实例,这里numElements是你需要发送的结构体元素数量。
ST_BonefractureInfo[] boneFractureInfos = new ST_BonefractureInfo[numElements];

填充结构体数组

根据实际业务逻辑,为结构体数组中的每个元素赋值。

for (int i = 0; i < numElements; i++)
{
    boneFractureInfos[i].nID = ...; // 填充ID
    boneFractureInfos[i].fScore = ...; // 填充分数
    boneFractureInfos[i].nLTX = ...; // 填充左上角X坐标
    boneFractureInfos[i].nLTY = ...; // 填充左上角Y坐标
    boneFractureInfos[i].nRBX = ...; // 填充右下角X坐标
    boneFractureInfos[i].nRBY = ...; // 填充右下角Y坐标
}

结构体数组到字节数组的转换

使用System.Runtime.InteropServices.Marshal类提供的方法将结构体数组转换为字节数组,以便通过Socket发送。

int structSize = Marshal.SizeOf(typeof(ST_BonefractureInfo));
int totalSize = structSize * numElements;

byte[] buffer = new byte[totalSize];

IntPtr ptr = IntPtr.Zero;
try
{
    ptr = Marshal.AllocHGlobal(totalSize);
    for (int i = 0; i < numElements; i++)
    {
        Marshal.StructureToPtr(boneFractureInfos[i], ptr + (i * structSize), false);
    }

    Marshal.Copy(ptr, buffer, 0, totalSize);
}
finally
{
    if (ptr != IntPtr.Zero)
    {
        Marshal.FreeHGlobal(ptr);
    }
}

这里,我们首先计算单个结构体的大小(structSize),然后计算整个结构体数组所需的总字节数(totalSize)。接着,分配一段足够大的未托管内存(IntPtr),逐个将结构体复制到这段内存中,并最终将内存中的数据复制到一个新的字节数组(buffer)中。

通过Socket发送字节数组

使用已经打开并连接好的Socket对象,调用其Send方法发送字节数组。

Socket socket = ...; // 获取已连接的Socket对象

// 发送数据
socket.Send(buffer, 0, buffer.Length, SocketFlags.None);

确保Socket处于正确状态且连接已经建立。这里假设socket变量已经包含了正确的Socket实例。使用Send方法将之前准备好的字节数组发送出去。 

以上就是一个完整的C# Socket发送结构体数组的示例过程。在实际应用中,别忘了处理可能发生的异常以及确保Socket的正确关闭。

 

二、Socket接收结构体数组

接收字节数组

使用已连接的Socket对象,调用其Receive方法接收数据,并存储到一个字节数组中。

Socket socket = ...; // 获取已连接的Socket对象

int receivedBytes = 0;
int totalBytesExpected = numElements * Marshal.SizeOf(typeof(ST_BonefractureInfo));
byte[] receivedBuffer = new byte[totalBytesExpected];

while (receivedBytes < totalBytesExpected)
{
    int bytesReceived = socket.Receive(receivedBuffer, receivedBytes, totalBytesExpected - receivedBytes, SocketFlags.None);
    if (bytesReceived == 0) throw new Exception("Connection closed by remote host.");
    receivedBytes += bytesReceived;
}

这里假设你知道待接收的结构体数组大小(即numElements)。在循环中,持续调用Receive方法直到接收到所有预期的数据。如果在接收过程中发现连接被远程主机关闭,抛出异常。

从字节数组还原结构体数组

使用System.Runtime.InteropServices.Marshal类提供的方法将接收到的字节数组转换回结构体数组。

ST_BonefractureInfo[] receivedBoneFractureInfos = new ST_BonefractureInfo[numElements];

IntPtr ptr = IntPtr.Zero;
try
{
    ptr = Marshal.AllocHGlobal(totalBytesExpected);

    Marshal.Copy(receivedBuffer, 0, ptr, totalBytesExpected);

    for (int i = 0; i < numElements; i++)
    {
        receivedBoneFractureInfos[i] = (ST_BonefractureInfo)Marshal.PtrToStructure(ptr + (i * Marshal.SizeOf(typeof(ST_BonefractureInfo))), typeof(ST_BonefractureInfo));
    }
}
finally
{
    if (ptr != IntPtr.Zero)
    {
        Marshal.FreeHGlobal(ptr);
    }
}

同样地,分配一段与接收到的字节数组大小相等的未托管内存,将字节数组复制到这段内存中。然后,遍历内存区域,每次从指定偏移量处将内存数据转换为对应的结构体对象,并添加到结构体数组中。 

现在,receivedBoneFractureInfos变量就包含了从Socket接收并解析得到的结构体数组。你可以进一步处理或使用这些数据了。记得处理可能出现的异常,并确保Socket的正确关闭。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows部署pgsql

1、下载&#xff1a;Download PostgreSQL Binaries 2、创建data目录作为数据目录 3、初始化 bin目录执行命令&#xff1a; .\initdb.exe -D E:\pgsql\data -E UTF-8 --localechs -U postgres -W 输入密码直到完成 4、启动数据库 .\pg_ctl.exe -D E:\pgsql\data -l logfil…

[大模型]MiniCPM-2B-chat WebDemo部署

MiniCPM-2B-chat WebDemo部署 MiniCPM-2B-chat 介绍 MiniCPM 是面壁智能与清华大学自然语言处理实验室共同开源的系列端侧大模型&#xff0c;主体语言模型 MiniCPM-2B 仅有 24亿&#xff08;2.4B&#xff09;的非词嵌入参数量。 经过 SFT 后&#xff0c;MiniCPM 在公开综合性…

吴恩达机器学习笔记:第 8 周-13 聚类(Clustering)13.1-13.2

目录 第 8 周 13、 聚类(Clustering)13.1 无监督学习&#xff1a;简介 第 8 周 13、 聚类(Clustering) 13.1 无监督学习&#xff1a;简介 在这个视频中&#xff0c;我将开始介绍聚类算法。这将是一个激动人心的时刻&#xff0c;因为这是我们学习的第一个非监督学习算法。我们…

Nexus 私服禁止 release 包覆盖发布

按照 maven 规范&#xff0c;对仓库中的包使用 snapshot 和 release 进行了区分&#xff0c;前者每次可以覆盖发布&#xff0c;会以时间的方式保留之前的包&#xff0c;并将 snapshot 包依赖下载地址指向最新覆盖发布的包&#xff0c;顾名思义快照包是为了解决我们开发测试过程…

React-css-in-js技术

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;React篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容:React-css-in-js技术 目录 1、简介 2、定义样式与使用 3、样式继承 4、属性传递 1、简介 …

Shortened LLaMA:针对大语言模型的简单深度剪枝法

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 论文标题 & 发表会议&#xff1a;Shortened LLaMA: A Simple Depth Pruning for Large Language Models&#xff08;ICLR 2024 Workshop&#xff09; 论文地址&#xff1a;https://arxiv.org/abs/…

Swift-22-复杂数据类型

枚举enum 本小节讨论的枚举是一种基础类型&#xff0c;并不是对象。在Swift中&#xff0c;枚举有很多高级特性。 语法结构 enum EnumName : Type { case... }&#xff0c;其中Type可以省略&#xff0c;{}中定义的枚举体至少包含一个case语句。 一个简单的实现如下&#xff0c…

【Lattice FPGA 开发】Modelsim与Diamond联合仿真

本文讲解Modelsim与Diamond进行联合仿真步骤&#xff0c;以及对遇到问题的解决与说明。 文章目录 软件版本0. Diamond设置文件为仿真文件特别注意 1. Diamond设置仿真软件为Modelsim2. Modelsim编译Lattice的库文件2.1 新建文件夹存放库文件2.2 Modelsim中建立新的仿真库2.2.1…

推荐一款websocket接口测试工具

网址&#xff1a;Websocket在线测试-Websocket接口测试-Websocket模拟请求工具 http://www.jsons.cn/websocket/ 很简单输入以ws开后的网址就可以了 这个网址是你后台设置的 如果连接成功会砸提示框内显示相关字样&#xff0c;反之则不行

【计算机毕业设计】学习平台产品功能介绍——后附源码

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…

Grid Controller

完整、易于使用的基于网格的第一人称控制器,具有《格里姆洛克传奇》、《地下城大师》和《巫师》的风格。 网格控制器是一种基于网格的第一人称控制器,设置简单,但具有鲁棒性和通用性。不需要脚本。 特征: 实时或基于回合的移动 平滑移动或即时捕捉到网格位置 倾斜、下降和蹲…

vivado 使用 JTAG-to-AXI Master 调试核进行硬件系统通信

使用 JTAG-to-AXI Master 调试核进行硬件系统通信 JTAG-to-AXI Master 调试核为可自定义核 &#xff0c; 可在运行时生成 AXI 传输事务并驱动 FPGA 内部的 AXI 信号。该核支持所 有存储器映射型 AXI 接口和 AXI4-Lite 接口 &#xff0c; 并且可支持位宽为 32 或 64 …

web安全学习笔记(12)

记一下第十六节课的内容。 一、jQuery Ajax 我们要先下载jQuery。 首先我们转移到template目录下&#xff0c;准备把jQuery下载到这下面。 直接wget下来就可以了。 这样我们就下载好了jQuery&#xff0c;下面我们学习如何使用。 jQuery 调用 ajax 方法 格式&#xff1a;$.…

CMC学习系列 (12):卒中患者的前三角肌和肱肌的 CMC 显著降低

卒中患者的前三角肌和肱肌的 CMC 显著降低 0. 引言1. 主要贡献2. 方法2.1 患者信息2.2 实验范式2.3 相干性计算 3. 结果4. 讨论5. 总结欢迎来稿 论文地址&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S1388245709002363 论文题目&#xff1a;Functional…

PLC工业网关,实现PLC联网

在当今工业自动化领域&#xff0c;PLC&#xff08;可编程逻辑控制器&#xff09;作为控制系统的核心&#xff0c;其稳定性和可靠性至关重要。然而&#xff0c;随着工业互联网和智能制造的快速发展&#xff0c;如何实现PLC的联网通信&#xff0c;提高数据传输效率&#xff0c;成…

电脑做Vlog有哪些软件 做电脑Vlog需要什么 电脑做vlog的视频软件 会声会影2023新功能

VLOG是指视频博客&#xff08;Video Blog&#xff09;&#xff0c;是一种通过视频形式记录和分享个人生活、经验、观点等的方式。类似于传统的博客&#xff0c;VLOG允许人们通过视频来表达自己的想法和感受&#xff0c;通常包括日常生活、旅行经历、美食探索、技能展示等内容。…

单链表的基本操作实现:初始化、尾插法、头插法、输出单链表、求表长、按序号查找、按值查找、插入结点、删除结点。

1.参考学习博文&#xff08;写的相当好的文章&#xff09;&#xff1a; http://t.csdnimg.cn/AipNl 2.关于我的总结&#xff1a; 定义单链表&#xff1a; typedef struct LNode {Elemtype data;struct LNode* next; }LNode; data用来存放元素值&#xff0c;next用来指向后…

go语言是如何实现协程的

写在文章开头 go语言的精华就在于协程的设计&#xff0c;只有理解协程的设计思想和工作机制&#xff0c;才能确保我们能够完全的利用协程编写强大的并发程序。 Hi&#xff0c;我是 sharkChili &#xff0c;是个不断在硬核技术上作死的 java coder &#xff0c;是 CSDN的博客专…

【云计算】云计算八股与云开发核心技术(虚拟化、分布式、容器化)

【云计算】云计算八股与云开发核心技术&#xff08;虚拟化、分布式、容器化&#xff09; 文章目录 一、什么是云计算&#xff1f;1、云计算的架构&#xff08;基础设施&#xff0c;平台&#xff0c;软件&#xff09;2、云计算的发展 二、如何做云计算开发&#xff1f;云计算的核…

IBM SPSS Statistics for Mac:数据分析的卓越工具

IBM SPSS Statistics for Mac是一款功能强大的数据分析软件&#xff0c;专为Mac用户设计&#xff0c;提供了一系列专业的统计分析和数据管理功能。无论是科研人员、数据分析师还是学生&#xff0c;都能从中获得高效、准确的数据分析支持。 IBM SPSS Statistics for Mac v27.0.1…