知识大全 C#和C++结构体Socket通信
Posted 结构
篇首语:寸阳分阴须爱惜,休负春色与时光。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C#和C++结构体Socket通信相关的知识,希望对你有一定的参考价值。
C#和C++结构体Socket通信 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
最近在用C#做一个项目的时候 Socket发送消息的时候遇到了服务端需要接收C++结构体的二进制数据流 这个时候就需要用C#仿照C++的结构体做出一个结构来 然后将其转换成二进制流进行发送 之后将响应消息的二进制数据流转换成C#结构
仿照C++结构体写出C#的结构来
using System Runtime InteropServices;
[Serializable] // 指示可序列化
[StructLayout(LayoutKind Sequential Pack = )] // 按 字节对齐
public struct Operator
public ushort id;
[MarshalAs(UnmanagedType ByValArray SizeConst = )] // 声明一个字符数组 大小为
public char[] name;
[MarshalAs(UnmanagedType ByValArray SizeConst = )]
public char[] pass;
public Operator(string user string pass) // 初始化
this id = ;
this name = user PadRight( \\ ) ToCharArray();
this pass = pass PadRight( \\ ) ToCharArray();
注意C#与C++数据类型的对应关系
C++与C#的数据类型对应关系表 API数据类型 类型描述 C#类型 API数据类型 类型描述 C#类型 WORD 位无符号整数 ushort CHAR 字符 char LONG 位无符号整数 int DWORDLONG 位长整数 long DWORD 位无符号整数 uint HDC 设备描述表句柄 int HANDLE 句柄 位整数 int HGDIOBJ GDI对象句柄 int UINT 位无符号整数 uint HINSTANCE 实例句柄 int BOOL 位布尔型整数 bool HWM 窗口句柄 int LPSTR 指向字符的 位指针 string HPARAM 位消息参数 int LPCSTR 指向常字符的 位指针 String LPARAM 位消息参数 int BYTE 字节 byte WPARAM 位消息参数 int
整个结构的字节数是 bytes
对应的C++结构体是
typedef struct
WORD id;
CHAR name[ ];
CHAR password[ ];
Operator;
发送的时候先要把结构转换成字节数组
using System Runtime InteropServices;
/// <summary>
/// 将结构转换为字节数组
/// </summary>
/// <param name= obj >结构对象</param>
/// <returns>字节数组</returns>
public byte[] StructToBytes(object obj)
//得到结构体的大小
int size = Marshal SizeOf(obj);
//创建byte数组
byte[] bytes = new byte[size];
//分配结构体大小的内存空间
IntPtr structPtr = Marshal AllocHGlobal(size);
//将结构体拷到分配好的内存空间
Marshal StructureToPtr(obj structPtr false);
//从内存空间拷到byte数组
Marshal Copy(structPtr bytes size);
//释放内存空间
Marshal FreeHGlobal(structPtr);
//返回byte数组
return bytes;
接收的时候需要把字节数组转换成结构
/// <summary>
/// byte数组转结构
/// </summary>
/// <param name= bytes >byte数组</param>
/// <param name= type >结构类型</param>
/// <returns>转换后的结构</returns>
public object BytesToStruct(byte[] bytes Type type)
//得到结构的大小
int size = Marshal SizeOf(type);
Log(size ToString() );
//byte数组长度小于结构的大小
if (size > bytes Length)
//返回空
return null;
//分配结构大小的内存空间
IntPtr structPtr = Marshal AllocHGlobal(size);
//将byte数组拷到分配好的内存空间
Marshal Copy(bytes structPtr size);
//将内存空间转换为目标结构
object obj = Marshal PtrToStructure(structPtr type);
//释放内存空间
Marshal FreeHGlobal(structPtr);
//返回结构
return obj;
实际操作
using System Collections;
using System Collections Generic;
using System Net;
using System Net Sockets;
byte[] Message = StructToBytes(new Operator( user pass )); // 将结构转换成字节数组
TcpClient socket = new TcpClient();
socket Connect(ip port);
NeorkStream ns = Socket GetStream();
ns Write(Message Message Length); // 发送
byte[] Recv = new byte[ ]; // 缓冲
int NumberOfRecv = ;
IList<byte> newRecv = new List<byte>();
ns ReadTimeout = ;
try
do
// 接收响应
NumberOfRecv = ns Read(Recv Recv Length);
for (int i = ; i < NumberOfRecv; i++)
newRecv Add(Recv[i]);
while (ns DataAvailable);
byte[] resultRecv = new byte[newRecv Count];
newRecv CopyTo(resultRecv );
Operator MyOper = new Operator();
MyOper = (Operator)BytesToStruct(resultRecv MyOper GetType()); // 将字节数组转换成结构
在这里取值的时候可能会出现只能取到一个字段 剩余的取不到的问题 怎么回事我也搞不懂 反正我的解决办法就是按照字节的顺序从resultRecv里分别取出对应的字段的字节数组 然后解码 例如
Operator name是 个字节 最后一位是 Operator id是 个字节 那么从第 位到第 位的字节就是Operator name的内容 取出另存为一个数组MyOperName Encoding Default GetString(MyOperName)就是MyOper name的内容
socket Close();
cha138/Article/program/c/201311/11108相关参考
横向技术分析C#、C++和Java优劣 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! C#诞生之
知识大全 一个Java 的 Socket 服务器和客户端通信的例子
一个Java的Socket服务器和客户端通信的例子 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
探析C#文件方式读写结构体 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 最近一直在研究NetM
一个最简单的Socket通信例子 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 所谓socket
疯狂Java讲义:使用Socket进行通信[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
疯狂Java讲义:使用Socket进行通信[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
利用Delphi编写Socket通信程序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!笔者在工作中
C#异步Socket代码示例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 下面的代码示例演示如
Java的socket通信的demo 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java代码
运用异步输入输出流编写Socket进程通信 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 杨健(