C#.NET和C++结构体Socket通信与数据转换

.NET开发者跨平台加密实战:OpenSSL.Net核心原理应用指南 在跨平台应用开发系统集成中,数据加密安全通信是保障信息安全的基石。其核心原理在于通过标准化的加密算法(如AES、RSA)协议(如TLS),确保数据在传输存储过程中的机密性、完整性身份认证。对于.NET开发者而言,虽然System.Security.Cryptography提供了强大的内置支持,但在广泛采用OpenSSL生态的Java、Python、Go等系统进行加密数据交换时,常因算法实现细节、默认参数(如填充模式、IV处理)的微妙差异而面临互操作性挑战。OpenSSL.Net作为一套C#编写的 阅读详情

C#.NET和C++结构体Socket通信与数据转换

最近在用C#做一个项目的时候,Socket发送消息的时候遇到了服务端需要接收C++结构体的二进制数据流,这个时候就需要用C#仿照C++的结 构体做出一个结构来,然后将其转换成二进制流进行发送,之后将响应消息的二进制数据流转换成C#结构。

1、仿照C++结构体写出C#的结构来


 1 using  System.Runtime.InteropServices;
 2
 3     [Serializable]  //  指示可序列化
 4     [StructLayout(LayoutKind.Sequential, Pack  =   1 )]  //  按1字节对齐
 5      public   struct  Operator
 6
 7      {
 8           public   ushort  id;
 9         [MarshalAs(UnmanagedType.ByValArray, SizeConst  =   11 )]  //  声明一个字符数组,大小为11
10          public   char [] name;
11         [MarshalAs(UnmanagedType.ByValArray, SizeConst  =   9 )]
12          public   char [] pass;
13
14           public  Operator( string  user,  string  pass)  //  初始化
15          {
16              this .id  =   10000 ;
17              this .name  =  user.PadRight( 11 ' /0 ' ).ToCharArray();
18              this .pass  =  pass.PadRight( 9 ' /0 ' ).ToCharArray();
19         }

20     }

21
22

 

    2、注意C#与C++数据类型的对应关系

 

C++与C#的数据类型对应关系表
API数据类型类型描述C#类型API数据类型类型描述C#类型
WORD16位无符号整数ushortCHAR字符char
LONG32位无符号整数intDWORDLONG64位长整数long
DWORD32位无符号整数uintHDC设备描述表句柄int
HANDLE句柄,32位整数intHGDIOBJGDI对象句柄int
UINT32位无符号整数uintHINSTANCE实例句柄int
BOOL32位布尔型整数boolHWM窗口句柄int
LPSTR指向字符的32位指针stringHPARAM32位消息参数int
LPCSTR指向常字符的32位指针StringLPARAM32位消息参数int
BYTE字节byteWPARAM32位消息参数int

整个结构的字节数是22bytes。

对应的C++结构体是:

 


1 typedef  struct
2 {
3      WORD id;            
4     CHAR name[ 11 ];
5     CHAR password[ 9 ];
6 }
Operator;
7
8

3、发送的时候先要把结构转换成字节数组

 


 1   using  System.Runtime.InteropServices;     
 2
 3           ///   <summary>
 4          ///  将结构转换为字节数组
 5          ///   </summary>
 6          ///   <param name="obj"> 结构对象 </param>
 7          ///   <returns> 字节数组 </returns>

 8          public   byte [] StructToBytes( object  obj)
 9          {
10              // 得到结构体的大小
11              int  size  =  Marshal.SizeOf(obj);
12              // 创建byte数组
13              byte [] bytes  =   new   byte [size];
14              // 分配结构体大小的内存空间
15             IntPtr structPtr  =  Marshal.AllocHGlobal(size);
16              // 将结构体拷到分配好的内存空间
17             Marshal.StructureToPtr(obj, structPtr,  false );
18              // 从内存空间拷到byte数组
19             Marshal.Copy(structPtr, bytes,  0 , size);
20              // 释放内存空间
21             Marshal.FreeHGlobal(structPtr);
22              // 返回byte数组
23              return  bytes;
24
25        }

26
27

接收的时候需要把字节数组转换成结构

 


 1 ///   <summary>
 2          ///  byte数组转结构
 3          ///   </summary>
 4          ///   <param name="bytes"> byte数组 </param>
 5          ///   <param name="type"> 结构类型 </param>
 6          ///   <returns> 转换后的结构 </returns>

 7          public   object  BytesToStruct( byte [] bytes, Type type)
 8          {
 9              // 得到结构的大小
10              int  size  =  Marshal.SizeOf(type);
11             Log(size.ToString(),  1 );
12              // byte数组长度小于结构的大小
13              if  (size  >  bytes.Length)
14              {
15                  // 返回空
16                  return   null ;
17             }

18              // 分配结构大小的内存空间
19             IntPtr structPtr  =  Marshal.AllocHGlobal(size);
20              // 将byte数组拷到分配好的内存空间
21             Marshal.Copy(bytes,  0 , structPtr, size);
22              // 将内存空间转换为目标结构
23              object  obj  =  Marshal.PtrToStructure(structPtr, type);
24              // 释放内存空间
25             Marshal.FreeHGlobal(structPtr);
26              // 返回结构
27              return  obj;
28         }

29

4、实际操作:

 


 1 using  System.Collections;
 2 using  System.Collections.Generic;
 3 using  System.Net;
 4 using  System.Net.Sockets;
 5
 6 byte [] Message  =  StructToBytes( new  Operator( " user " , " pass " ));  //  将结构转换成字节数组
 7
 8 TcpClient socket  =   new  TcpClient();
 9
10 socket.Connect(ip,port);
11
12 NetworkStream ns  =  Socket.GetStream();
13
14 ns.Write(Message, 0 ,Message.Length);  //  发送
15
16 byte [] Recv  =   new   byte [ 1024 ];  //  缓冲
17
18 int  NumberOfRecv  =   0 ;
19
20 IList < byte >  newRecv  =   new  List < byte > ();
21 ns.ReadTimeout  =   3000 ;
22 try
23 {
24 do
25 {
26 //  接收响应
27 NumberOfRecv  =  ns.Read(Recv,  0 , Recv.Length);
28 for  ( int  i  =   0 ; i  <  NumberOfRecv; i ++ )
29 newRecv.Add(Recv[i]);
30 }

31 while  (ns.DataAvailable);
32 byte [] resultRecv  =   new   byte [newRecv.Count];
33 newRecv.CopyTo(resultRecv,  0 );
34
35 Operator MyOper  =   new  Operator();
36
37 MyOper  =  (Operator)BytesToStruct(resultRecv, MyOper.GetType());  //  将字节数组转换成结构

38

在这里取值的时候可能会出现只能取到一个字段,剩余的取不到的问题,怎么回事我也搞不懂,反正我的解决办法就是按照字节的顺序从 resultRecv里分别取出对应的字段的字节数组,然后解码,例如:

Operator.name是11个字节,最后一位是0,Operator.id是2个字节,那么从第3位到第12位的字节就是 Operator.name的内容,取出另存为一个数组 MyOperName,Encoding.Default.GetString(MyOperName)就是MyOper.name的内容。

 


1 socket.Close();
2
3 ns.Close();
4
游戏引擎多语言脚本系统架构:C#、Lua、Python混合编程实战 在游戏开发软件工程领域,脚本系统是实现逻辑解耦、热更新提升开发效率的关键技术。其核心原理在于通过虚拟机或解释器,将动态语言嵌入到宿主程序中,实现运行时逻辑的动态加载执行。这种架构的技术价值在于分离了核心框架业务逻辑,使得核心代码保持稳定,而频繁变化的游戏玩法、工具链或配置则可以通过脚本快速迭代,显著提升了开发灵活性维护性。从应用场景看,游戏中的角色AI、技能逻辑、UI交互,以及编辑器中的资源处理、自动化测试等,都是脚本系统的典型用武之地。本文聚焦于在游戏引擎中构建一套实用的多语言混合脚本系统,深入 阅读详情

相关推荐

OpenDRIVE格式在UnityUnreal Engine中的实战应用仿真闭环构建

OpenDRIVE作为描述道路网络的开放XML标准,定义了车道、路沿、交通标志等静态元素的几何逻辑关系,是自动驾驶仿真领域的通用数据格式。其核心原理在于通过参考线参数化偏移来精确描述道路三维几何拓扑。这一标准的技术价值在于实现了高精度道路数据的跨平台、跨工具交换,为仿真测试提供了统一的数据基础。在应用场景上,OpenDRIVE数据广泛应用于自动驾驶算法测试、驾驶模拟器开发以及数字孪生城市建设。本文将探讨如何将OpenDRIVE数据导入UnityUnreal Engine两大主流游戏引擎,解决坐标系

weixin_30628801的博客 388

基于C#调用c++Dll结构体数组指针的问题详解

下面小编就为大家分享一篇基于C#调用c++Dll结构体数组指针的问题详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

C#实现Modbus TCP/IP数据采集程序实战

Modbus协议是一种在工业自动化领域广泛使用的串行通信协议。它由Modicon(现为施耐德电气的一部分)于1979年开发,主要用于连接电子控制器。Modbus能够用来进行简单的设备监视控制,广泛应用于如HVAC、消防安全系统、门禁等不同的工业应用中。C#(发音为"C Sharp")是微软开发的一种面向对象、类型安全的编程语言,它是.NET框架的一部分。自2002年随.NET框架首次发布以来,C#语言已经成为开发Windows桌面应用程序、网站、云服务移动应用的主流语言之一。

weixin_32480007的博客 2067

protobuf对象结构体c++例子

protobuf(简称 protobuf)是一种用于序列化结构化数据的轻量级消息协议。它可以将结构化数据(如消息、请求、响应等)序列化为二进制数据流,并且可以将这些数据流反序列化为原来的结构化数据。 下面是一个使用 protobuf 将一个 protobuf 对象换为结构体的例子:

huangshuo0的博客 1480

c++的类型

c++的类型换1、静态类型换(static_cast)可作用于 基本类型可用于 自定义数据类型(结构体 类)不能作用于 不相关的类之间换2、动态换dynamic_cast 2-1不支持 基本类型可以上行换 (父类指针 指向 子类空间 安全)不支持下行换 (子类指针 指向 父类空间 不安全)不支持 没有关系的 类型换3、常量换const_cast支持常量指针为不同指针不支持 非指针...

兰天禄的博客 573

C++C# 双向简单的socket通讯 适用c#c# c++c++

程序1 创建两个socket 一个绑定套接字 一个不绑定 然后用绑定的socket来专门接收8000端口的消息 用不绑定的socket来发送8001端口的消息 程序2创建两个socket 一个绑定套接字 一个不绑定 然后用绑定的socket来专门接收8001端口的消息 用不绑定的socket来发送8000端口的消息 程序1代码如下 C# public static...

qq_26384541的博客 7580

三种C++C#的方法(带指针换、Demo源码)

第一种是直接添加c++项目引用 第二种是使用DllImport的方式 前两种可以参考: https://blog.csdn.net/zxy13826134783/article/details/84190800 第三种是本文需要介绍的,而且封装ffmpeg视频库的C#源码的开源库FFmpeg.AutoGen也是使用下面的方法 本文测试环境: win7 vistual studi...

zxy13826134783的博客 1万+

C++C# 采用socket 在进程间进行通信

C++ socket 客户端 // client.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 #include<iostream> #include<winsock.h> #pragma comment(lib,"ws2_32.lib") using namespace std; void initialization(); int main() { //定义长度变量 int send_len = 0; int recv_len = 0; /

Alonewaiting 2718

C#企业级即时通讯源代码分析实践

本文还有配套的精品资源,点击获取 简介:本项目是一个使用C#语言开发的企业级即时通讯系统源代码,旨在展示如何通过.NET框架构建企业QQ接口交互应用。源代码涉及网络通信、数据序列化、异步处理、事件驱动编程、界面设计、多线程管理、错误处理、授权安全以及数据存储等多个技术要点,通过分析实践,有助于开发者深入理解C#在企业应用中的实际运用。 1. C#基础企业应用介绍 ...

weixin_42502040的博客 1130

实时监控Win7Win8任务栏网络流量的实用小工具

在开发网络监控软件时,除了直接使用Windows API之外,还可以利用现有的第三方网络监控库来简化开发流程。这些库封装了网络通信、数据处理等复杂操作,允许开发者更快地构建应用程序。一些流行的网络监控库包括如pcap(用于网络流量捕获)、Boost.Asio(用于跨平台的网络编程)等。pcap库广泛用于网络监控工具中,因为它可以捕获经过网络接口的所有数据包。Boost.Asio则适合需要进行高度定制网络操作的应用程序。库名称功能特点适用场景学习曲线WinPcap。

weixin_31163455的博客 1312

UnityROS通信实战:ROS-TCP-Endpoint安装配置性能调优指南

在机器人仿真数字孪生领域,实现虚拟环境实体控制系统的实时数据交互是核心技术挑战。其核心原理在于建立稳定、高效的通信桥梁,将仿真环境中的物理状态、传感器数据机器人操作系统(ROS)中的控制算法、决策逻辑进行双向同步。ROS-TCP-Endpoint作为官方维护的专用通信端点,其技术价值在于通过标准化的TCP二进制协议,为UnityROS的集成提供了高性能、低延迟的解决方案,有效解决了通用桥接工具配置繁琐、性能开销大的痛点。该方案特别适用于机械臂数字孪生、自动驾驶模拟等需要高频数据交换的应用场景。本文以

weixin_30632883的博客 421

基于Java Mina 通信框架的JT/T809发服务器设计

Apache MINA 是 Apache 组织的一个开源项目,为开发高性能高可用性的网络应用程序提供了非常便利的框架。 也是Java开发者的一个福利(.NET目前还没有类似封装的这么好的基础socket通信框架),不用像.NET开发者,吭哧吭哧的写上半天,一看还在搞socket库呢,还没进入应用层面。 这个框架的优点: – 异步  – 无阻塞  – 事件驱动  – 支持TCP,

冷月宫主的专栏 2492

基于UnityAI姿态估计的实时动作捕捉:低成本驱动3D Avatar

动作捕捉技术是连接现实虚拟世界的桥梁,其核心原理是通过传感器或视觉数据采集人体运动信息,并映射到数字角色的骨骼系统上。传统方案依赖昂贵的光学或惯性设备,而基于计算机视觉AI姿态估计的技术路径,凭借其低成本、易部署的优势,正成为个人开发者中小团队实现实时驱动的首选。通过开源框架如MediaPipe或OpenPose,可从普通RGB摄像头中提取人体关节点数据,再经由坐标换、数据平滑骨骼映射算法,驱动Unity引擎中的3D角色。这项技术极大地降低了元宇宙内容创作、虚拟直播、互动体验等应用场景的入门门槛,

weixin_34248487的博客 313

Unity集成本地语音识别:基于Qwen3-ASR-1.7B的实时交互方案

自动语音识别(ASR)技术是实现人机自然交互的核心,其原理是通过声学模型语言模型将音频信号换为文本。在游戏开发领域,这项技术的价值在于能创建沉浸式、低延迟的语音控制体验,但传统云端方案存在网络延迟隐私顾虑。本地部署ASR模型成为关键解决方案,它通过将推理计算放在终端设备,确保了实时性数据安全。本文以Qwen3-ASR-1.7B这一高性能、轻量化的模型为例,深入探讨了在Unity引擎中实现本地语音识别的工程实践。通过采用分层架构设计,利用ONNX Runtime进行高效推理,并结合命名管道实现进程间通

weixin_34417200的博客 336
上一篇: C#.NET和C++结构体Socket通信与数据转换
下一篇: HTML5 WebSocket:下一次Web通信革命揭幕
zfrong
博客等级 码龄19年 7122粉丝 43原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值