通过TCP传送结构体。(我已经可能正收发包含有string,int型的结构体了,可是如果结构体中包含int[]数组,就搞不定了。)
通过TCP传送结构体。(我已经可能正收发包含有string,int型的结构体了,可是如果结构体中包含int[]数组,就搞不定了。) 问题点数:33、回复次数:11Top
1 楼roseguns(阿影)回复于 2004-10-18 14:11:30 得分 0
UP一下,分数不够再加。Top
2 楼roseguns(阿影)回复于 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);
}
}
Top
3 楼BeginnerBBB()回复于 2004-10-18 14:33:05 得分 3
序列化与反序列化Top
4 楼roseguns(阿影)回复于 2004-10-18 14:57:07 得分 0
不好意思,有一个前提没有说:客户端是C#,服务器端是VC6,可以用序列化和反序列的概念吗?Top
5 楼roseguns(阿影)回复于 2004-10-19 11:25:48 得分 0
今天UP一下.Top
6 楼gbbword(分不清)回复于 2004-10-19 11:37:17 得分 3
可惜楼主说的不够详细,不然就可以多学习点了。顶一下!Top
7 楼gbbword(分不清)回复于 2004-10-19 11:41:10 得分 0
不知道系统认不认你这种在内存中与结构体一样的东西。很想知道。再顶一下!Top
8 楼roseguns(阿影)回复于 2004-10-19 12:16:12 得分 0
当然认了,我的例子中基本实现了这个功能,现在就是int[]数组不能正常收发与装配.
有关更详细的说明,大家请前往此页:
http://blog.csdn.net/roseguns/archive/2004/10/19/142408.aspxTop
9 楼programbin(终极猫咪)回复于 2004-11-03 10:00:31 得分 3
我觉的用 remoting 不是更好吗?Top
10 楼ET2004(外星人)回复于 2005-01-22 01:43:14 得分 24
to programbin:
用 .NET Remoting 还不如用 BinaryFormatter 来序列化和反序列化,.NET Remoting 本身就是基于序列化和反序列化的。
只不过用序列化和反序列化会产生额外的数据,而且必须保证发送端和接收端都基于 .NET 平台(至少能支持序列化和反序列化)。
楼主的思路是很好的,也给了我很大的启发,因为我最近也碰到同样的问题,在这里顺便感谢一下楼主!^_^ 如果能解决剩下的问题就比较完美了。
Top
11 楼mfkygazb(zb)回复于 2005-03-25 16:44:48 得分 0
upTop





