Byte[] buff = new Byte[2048];
                sock.Receive(buff);//接收返回
怎么把这2个结构体弄出来
        public struct statisticalData
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
            public char[] serviceUpTime;     //服务启动时间
            public long connectionsSoFar;    //累计连接数量
            public int currentConnections;   //当前连接数量
            public int concurrenceMax;       //最大并发连接数量
            public long totalRead;           //累计收取数据量
            public long totalWrite;          //累计发送数据量
            public long totalReadMessage;    //累计接收消息包数量
            public long totalWriteMessage;   //累计发送消息包数量 
            public int maxReadSpeed;         //最高接收速率
            public int maxWriteSpeed;        //最高发送速率
            public int currentReadSpeed;     //当前接收速率
            public int currentWriteSpeed;    //当前发送速率
        } ;        public struct stClientHead
        {
            public Int32 nLen;        //后续数据长度
            public byte nType;       //消息类型
            public Int32 nPVersion;   //协议版本
            public Int32 nSocketFd;   //socketfd 
            public byte bPriority;    //连接的优先级(消息类型等于106启用)
        }

解决方案 »

  1.   

    int nSize = Marshal.SizeOf(typeof(statisticalData1));
    IntPtr structPtr = Marshal.AllocHGlobal(nSize);
                    Marshal.Copy(bufferTemp, 0, structPtr, nSize);
                    object obj = Marshal.PtrToStructure(structPtr, typeof(statisticalData1));
                    Marshal.FreeHGlobal(structPtr);
                    statisticalData strtemp = (statisticalData )obj;
      

  2.   

    看你的包名字应该是第stClientHead 在前面 statisticalData 在后面的       int _ClientHeadSize = Marshal.SizeOf(typeof(stClientHead));
                IntPtr _ClientHeadIntPtr = Marshal.AllocHGlobal(_ClientHeadSize);
                Marshal.Copy(_Value, 0, _IntPtr, _ClientHeadSize);
                object _ClientHeadOBject = Marshal.PtrToStructure(_ClientHeadIntPtr, typeof(stClientHead));
                int _DataSize = Marshal.SizeOf(typeof(statisticalData));
                IntPtr _DataIntPtr = Marshal.AllocHGlobal(_DataSize);
                Marshal.Copy(_Value, _ClientHeadSize, _DataIntPtr, _DataSize);
                object _ClientHeadOBject = Marshal.PtrToStructure(_DataIntPtr, typeof(stClientHead));
      

  3.   

    计算出2个结构体长度,分拆BUFFER,你这2个结构体的长度分别为88和20,用Marshal.SizeOf(typeof结构体实例)); 计算出长度,然后分拆,第一个为buffer的0-87位,第二个位Buffer的88-107位,分开到2个byte[]中去,然后用上面的函数拆
      

  4.   

    怎么把大buffer分成两个小的buffer啊??
      

  5.   

    怎么把大buffer分成两个小的buffer啊?? 
      

  6.   

    你要分成两个小的buffer做什么?都可以直接提取两个结构体了,根本用不着拆分。
    看来你是需要把代码喂到嘴边才行。
          Byte[] buff = new Byte[2048]; 
         sock.Receive(buff);//接收返回      int _ClientHeadSize = Marshal.SizeOf(typeof(stClientHead)); 
         IntPtr _ClientHeadIntPtr = Marshal.AllocHGlobal(_ClientHeadSize); 
         Marshal.Copy(buff, 0, _ClientHeadIntPtr , _ClientHeadSize); 
         stClientHead _ClientHeadOBject = (stClientHead)Marshal.PtrToStructure(_ClientHeadIntPtr, typeof(stClientHead)); 
         Marshal.FreeHGlobal(_ClientHeadIntPtr);     int _DataSize = Marshal.SizeOf(typeof(statisticalData)); 
         IntPtr _DataIntPtr = Marshal.AllocHGlobal(_DataSize); 
         Marshal.Copy(buff, _ClientHeadSize, _DataIntPtr, _DataSize); 
         statisticalData _ClientHeadOBject = (statisticalData)Marshal.PtrToStructure(_DataIntPtr, typeof(statisticalData)); 
         Marshal.FreeHGlobal(_DataIntPtr);
      

  7.   

    晕倒,你看代码怎么一点都不仔细啊。
    Marshal.Copy方法的参数里有指明在buff中的偏移量,你自己看第二个参数,第一次用的时候是0,第二次是_ClientHeadSize,也就是从上次读取的最后开始。
      

  8.   

    紧急求助,请问下如何在VB.net中利用TCP发送结构体啊,本人是菜鸟,发送的结构体中包含结构体和string、数组类型、整型;接收端接受的整型数据没有问题,但结构体和string、数组类型接收为乱码,或直接收不到。请高手赐教!!!!!!!十分感谢,
      

  9.   

    我试了用VB.netTCP发送结构体,在指针转化为结构体时类似上面代码部分语句:statisticalData _ClientHeadOBject= (statisticalData)Marshal.PtrToStructure(_DataIntPtr,typeof(statisticalData)); 即把指针还原为结构体老出现试图访问已经损坏的内存,或者读写内存,请帮忙高手解答下这个问题吧,谢谢了