我有一个自己编写的服务器客户端程序。我正在使用TCP协议的套接字。我正试图从客户端发送缓冲区到服务器。该缓冲区结构,我将其转换为字节数组,把它和在服务器上我将其转换回结构从字节数组:C#网络 - 用StructLayout包发送结构缓冲区1
public static byte[] StructToByteArray(loginStruct obj)
{
int len = Marshal.SizeOf(typeof(loginStruct));
byte[] arr = new byte[len];
IntPtr ptr = Marshal.AllocHGlobal(len);
Marshal.StructureToPtr(obj, ptr, true);
Marshal.Copy(ptr, arr, 0, len);
Marshal.FreeHGlobal(ptr);
return arr;
}
public static void ByteArrayToStruct(byte[] buffer, ref loginStruct obj)
{
int len = Marshal.SizeOf(typeof(loginStruct));
IntPtr i = Marshal.AllocHGlobal(len);
Marshal.Copy(buffer, 0, i, len);
obj = (loginStruct)Marshal.PtrToStructure(i, obj.GetType());
Marshal.FreeHGlobal(i);
}
我的结构:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct loginStruct
{
public string userName;
public string password;
public loginStruct(string userName, string password)
{
this.userName = userName;
this.password = password;
}
}
我得到一个运行时错误的行:
obj = (loginStruct)Marshal.PtrToStructure(i, obj.GetType());
错误是:
试图读取或写入受保护的内存。这通常表明其他内存已损坏。
论功能ByteArrayToStruct len为服务器等于缓冲区大小是16
谢谢。它帮助了我。我还有一个问题。如果我得到这个结构: 'struct user { string firstName; string lastName; } struct sendBuffer { string name; 列表 userList; }' 如何知道sendBuffer结构的大小? –
user2320928
如果您打算将结构发送到非托管代码,我绝对会100%远离C#容器类;你只是在乞求问题。使用sizeconst的数组和marshalas lparray。 –