通过TCP传送结构体
主 题: 通过TCP传送结构体。(我已经可能正收发包含有string,int型的结构体了,可是如果结构体中包含int[]数组,就搞不定了。)
作 者: roseguns (阿影)
等 级: ^^^
信 誉 值: 98
所属社区: .NET技术 C#
问题点数: 33
回复次数: 9
发表时间: 2004-10-18 13:57:24
通过TCP传送结构体。(我已经可能正收发包含有string,int型的结构体了,可是如果结构体中包含int[]数组,就搞不定了。)
回复人: roseguns(阿影) ( 三级(初级)) 信誉:98 2004-10-18 14:11:31 得分: 0
UP一下,分数不够再加。
回复人: roseguns(阿影) ( 三级(初级)) 信誉:98 2004-10-18 14:24:33 得分: 0
通过TCP传送结构体,服务器端收不到结构体中的整型数组的值;
(我已经可能正收发包含有string,int型的结构体了,可是如果结构体中包含int[]数组,就搞不定了。)---------------------------------------------------------------------------------------------
〔相关背景资料:〕
客户端结构体与服务器端的结构体格式相同,定义如下:
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi,Pack=1)]
public struct cc
{
public int account;
[MarshalAs(UnmanagedType.ByValTStr,SizeConst=10)]
public string passWord;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=10)]
public int[] number;
}
客户端在发送结构体前首先将结构体转换为
byte[]
数组,函数如下:
static byte[] StructToBytes(cc structObj)
{
int size = 0;
try
{
size = Marshal.SizeOf(structObj);
}
catch (Exception ex)
{
string rr = ex.Message;
}
IntPtr buffer = Marshal.AllocHGlobal(size);
try
{
Marshal.StructureToPtr(structObj, buffer, true);
byte[] bytes = new byte[size];
Marshal.Copy(buffer, bytes, 0, size);
return bytes;
}
catch (Exception ex)
{
string rr = ex.Message;
return null;
}
finally
{
Marshal.FreeHGlobal(buffer);
}
}
服务器端在收到客户端流后将流转换为结构体,函数如下:
public cc BytesToStruct(byte[] bytes, cc c1)
{
int size = Marshal.SizeOf(c1);
IntPtr buffer = Marshal.AllocHGlobal(size);
try
{
Marshal.Copy(bytes, 0, buffer, size);
return (cc)Marshal.PtrToStructure(buffer, c1.GetType());
}
finally
{
Marshal.FreeHGlobal(buffer);
}
}
回复人: BeginnerBBB() ( 二级(初级)) 信誉:97 2004-10-18 14:33:05 得分: 0
序列化与反序列化
回复人: roseguns(阿影) ( 三级(初级)) 信誉:98 2004-10-18 14:57:08 得分: 0
不好意思,有一个前提没有说:客户端是C#,服务器端是VC6,可以用序列化和反序列的概念吗?
回复人: roseguns(阿影) ( 三级(初级)) 信誉:98 2004-10-19 11:25:00 得分: 0
今天UP一下.
回复人: gbbword(分不清) ( 三级(初级)) 信誉:100 2004-10-19 11:37:00 得分: 0
可惜楼主说的不够详细,不然就可以多学习点了。顶一下!
回复人: gbbword(分不清) ( 三级(初级)) 信誉:100 2004-10-19 11:41:00 得分: 0
不知道系统认不认你这种在内存中与结构体一样的东西。很想知道。再顶一下!
回复人: roseguns(阿影) ( 三级(初级)) 信誉:98 2004-10-19 12:16:00 得分: 0
当然认了,我的例子中基本实现了这个功能,现在就是
int[]
数组不能正常收发与装配.
有关更详细的说明,大家请前往此页:http://blog.csdn.net/roseguns/archive/2004/10/19/142408.aspx
回复人: programbin(终极猫咪) ( 一级(初级)) 信誉:100 2004-11-03 10:00:00 得分: 0
我觉的用 remoting 不是更好吗?