首页 新闻 搜索 专区 学院

C#中在进行客户端发送数据到服务器中时,遇到System.AccessViolationException

0
悬赏园豆:60 [待解决问题]

客户端代码:

void OnConnectSendMessageToServer(object obj)
{
Socket client_socket = (Socket)obj;
print("程序运行到此");
CMD_C_ConnectData conData = new CMD_C_ConnectData();
byte[] data = new byte[1024];
string msg = "123456";
conData.buffer = Encoding.UTF8.GetBytes(msg);
conData.nLen = conData.buffer.Length;
conData.dataStatus = CMD_C_DataStatus.SUB_C_NULL;

try
{
IntPtr strucPtr = Marshal.AllocHGlobal(Marshal.SizeOf(conData));
Marshal.StructureToPtr(conData,strucPtr,false);
Marshal.Copy(strucPtr,data,0,Marshal.SizeOf(conData));
Marshal.FreeHGlobal(strucPtr);
IntPtr dataPtr = Marshal.AllocHGlobal(conData.buffer.Length);
Marshal.Copy(conData.buffer,0,dataPtr,conData.buffer.Length);
Marshal.Copy(dataPtr, data, Marshal.SizeOf(conData), conData.buffer.Length);
Marshal.FreeHGlobal(dataPtr);
for (int i = 0; i < data.Length; i++)
{
print(i + " " + data[i]);
}
client_socket.Send(data, data.Length, SocketFlags.None);
}
catch (Exception ex)
{
print(ex.Message);
}
}

服务端代码

byte[] buffer = new byte[1024];
int num = clients.Receive(buffer);

if (num <= 0) return;
recvData sRecvData = new recvData();
int size = Marshal.SizeOf(sRecvData);
IntPtr structPtr = Marshal.AllocHGlobal(size);
Marshal.Copy(buffer,0,structPtr,size);
try
{
sRecvData = (recvData)Marshal.PtrToStructure(structPtr, typeof(recvData));
Marshal.FreeHGlobal(structPtr);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message+"fadsfadsfadfasdfasd");
throw;
}

其中在sRecvData = (recvData)Marshal.PtrToStructure(structPtr, typeof(recvData));调试下报错,错误信息为:

“System.AccessViolationException”类型的第一次机会异常在 mscorlib.dll 中发生

其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

乐舞声的主页 乐舞声 | 初学一级 | 园豆:99
提问于:2016-05-11 15:43
< >
分享
所有回答(1)
0

这种错误,你先调整项目属性,生成里面改成x86试试。

Supper_litt | 园豆:981 (小虾三级) | 2016-05-11 22:22

已更改

支持(0) 反对(0) 乐舞声 | 园豆:99 (初学一级) | 2016-05-12 10:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册