通过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 不是更好吗?

Contributors: FHL