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

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

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

一、Socket发送结构体数组

定义结构体数组

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

cs 复制代码
[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];

填充结构体数组

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

cs 复制代码
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发送。

cs 复制代码
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方法发送字节数组。

cs 复制代码
Socket socket = ...; // 获取已连接的Socket对象

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

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

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

二、Socket接收结构体数组

接收字节数组

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

cs 复制代码
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类提供的方法将接收到的字节数组转换回结构体数组。

cs 复制代码
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的正确关闭。

相关推荐
huaqianzkh13 小时前
WinForm C#:循环修改控件UI闪烁卡顿?SuspendLayout / ResumeLayout 与 BeginUpdate 优化
开发语言·ui·c#
用户3721574261351 天前
C# 实现 Excel 单元格保护:锁定公式并允许编辑指定区域
c#·ai编程·编程语言
公子小六1 天前
基于.NET的Windows窗体编程之WinForms数据持久化(1)
windows·microsoft·c#·.net·winforms
三雷科技1 天前
第6章第4节:自定义分词器
开发语言·c#
zhanghaha13142 天前
C# 系列教程_12 字符串 string 保姆级系统教程(面向新手,大量示例 + 原理讲解)
开发语言·数据库·c#
Coder_Shenshen2 天前
罗克韦尔ACD工程归档离线变量树解析
算法·c#
寂寞的船2 天前
【Unity知识速递】第10期 Unity GC 零分配实战:从 UnityEngine.Pool 到手动 GC 控制的全链路优化
jvm·unity·c#·游戏引擎·lucene
1-1=03 天前
C# 数据结构和特殊类型
数据结构·c#·.net·.netcore
波力海苔夹心脆6754 天前
C# WPF 资源字典详解:ResourceDictionary、MergedDictionaries 与自定义控件案例
开发语言·c#·wpf·入门教程·resource·资源字典
AI导出鸭PC端4 天前
Perplexity批量导出没有PDF模式?AI导出鸭插件补上最后一块拼图
人工智能·pdf·c#·ai导出鸭