C#通过TCP传送结构体

原创 2007年10月13日 20:04:00

        在写C#TCP通信程序时,发送数据时,只能发送byte数组,处理起来比较麻烦不说,如果是和VC6.0等写的程序通信的话,很多的都是传送结构体,在VC6.0中可以很方便的把一个char[]数组转换为一个结构体,而在C#却不能直接把byte数组转换为结构体,要在C#中发送结构体,可以按以下方法实现:

(1)定义结构体:

 //命名空间
using System.Runtime.InteropServices;

    
//注意这个属性不能少
    [StructLayoutAttribute(LayoutKind.Sequential,CharSet=CharSet.Ansi,Pack=1)]
    
struct TestStruct
    
...{
        
public int c;
        
//字符串,SizeConst为字符串的最大长度
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
        
public string str;
        
//int数组,SizeConst表示数组的个数,在转换成
        
//byte数组前必须先初始化数组,再使用,初始化
        
//的数组长度必须和SizeConst一致,例test = new int[6];
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
        
public int[] test;
    }

(2)结构体转byte数组:

        /**//// <summary>
        
/// 结构体转byte数组
        
/// </summary>
        
/// <param name="structObj">要转换的结构体</param>
        
/// <returns>转换后的byte数组</returns>

        public static byte[] StructToBytes(object structObj)
        
...{
            
//得到结构体的大小
            int size = Marshal.SizeOf(structObj);
            
//创建byte数组
            byte[] bytes = new byte[size];
            
//分配结构体大小的内存空间
            IntPtr structPtr = Marshal.AllocHGlobal(size);
            
//将结构体拷到分配好的内存空间
            Marshal.StructureToPtr(structObj, structPtr, false);
            
//从内存空间拷到byte数组
            Marshal.Copy(structPtr, bytes, 0, size);
            
//释放内存空间
            Marshal.FreeHGlobal(structPtr);
            
//返回byte数组
            return bytes;
        }

(3)byte数组转结构体:

        /**//// <summary>
        
/// byte数组转结构体
        
/// </summary>
        
/// <param name="bytes">byte数组</param>
        
/// <param name="type">结构体类型</param>
        
/// <returns>转换后的结构体</returns>

        public static object BytesToStuct(byte[] bytes,Type type)
        
...{
            
//得到结构体的大小
            int size = Marshal.SizeOf(type);
            
//byte数组长度小于结构体的大小
            if (size > bytes.Length)
            
...{
                
//返回空
                return null;
            }

            
//分配结构体大小的内存空间
            IntPtr structPtr = Marshal.AllocHGlobal(size);
            
//将byte数组拷到分配好的内存空间
            Marshal.Copy(bytes,0,structPtr,size);
            
//将内存空间转换为目标结构体
            object obj = Marshal.PtrToStructure(structPtr, type);
            
//释放内存空间
            Marshal.FreeHGlobal(structPtr);
            
//返回结构体
            return obj;
        }

C语言udp socket发送结构体

利用udp发送数据时,可能会发送不同类型的数据,多种类型数据通过一条udp报文发送需要,因此需要建立一个结构体对需要发送的数据进行定义。但是udp发送的是char型参数,因此需要将结构体转换为char...
  • u013167809
  • u013167809
  • 2016-07-05 20:18:57
  • 2582

Wireshark抓取本地Tcp包(任何数据包)

没有任何一个程序员在做项目的时候不会遇到网络编程的问题,要解决这些问题除了对各种网络协议深入了解之外,还需要掌握各种网络分析工具的用法,不用多说wireshark绝对是这方面的翘楚,可惜的是,wire...
  • u013613428
  • u013613428
  • 2016-11-14 11:03:55
  • 8592

C# UDP接收结构体数据类型-----只能读取第一个字段的问题

在C#的UDP接收嵌入式设备端发送的结构体数据时,经过 //声明一个SDK_MSG_DEVICEINFO的结构体 [Serializable] // 指示可序列化 [StructLayoutAttri...
  • woofilian
  • woofilian
  • 2016-12-01 18:04:59
  • 872

udp 发送和接收结构体数据

windows下udp发送和接收结构体数据
  • qq_29422251
  • qq_29422251
  • 2016-11-29 11:23:22
  • 2342

VS2008编写tcp客户端上位机与STM32单片机通信(结构体)

一般来讲,如果上位机需要与下位机通信,最底层物理层比较常见的就是串口通信,还有一种比较方便的物理通路就是以太网。 为了通信,制定一个通信协议是很重要的,现有的需求是通过tcp上位机配置下位机的上网方...
  • u010615629
  • u010615629
  • 2017-02-26 13:29:11
  • 1657

TCP-socket发送结构体类型数据

UDP传输模式是数据报,TCP传输模式为字节流,字节流与数据报区别在于有边界与无边界。例如:TCP客户端发送了三个数据包,开的缓存足够大服务端一次可接收三个数据包的数据,这就是无边界。UDP客户端发送...
  • hanghang121
  • hanghang121
  • 2015-09-23 09:13:25
  • 3065

TCP socket发送整形数据(数组,结构体)

使用TCP发送整型等(非字符型)数据时,经常会遇到不能将发送类型转换成const char*的错误。这其实是socket设定的问题,socket设定为只能传送字符型数据。 从read和write的函...
  • tecsai
  • tecsai
  • 2016-12-02 09:52:47
  • 1812

BOOST UDP 网络通信(2) --如何传输结构体

①、Struct.h -- 存放传输数据的结构体  //由于不同操作系统之间的字节对齐方式不同,故网络传输数据时,要设置字节对齐方式 //设置变量以n字节对齐方式,指定结构体、联合以及类成员 #pr...
  • LearnLHC
  • LearnLHC
  • 2017-07-16 12:19:14
  • 618

<em>UDP</em>实现收发

java <em>Udp</em> 收发<em>结构体</em>实例 Socket编程 立即下载 上传者: q345080370 时间: ...上传者: puyunzhong 时间: 2016-04-<em>23</em> 综合评分: 0 积分/<em>C</em>币:3 C# <em>UDP</em>...
  • 2018年04月10日 00:00

socket C#与Delphi互传结构体

摘要:       Delphi与C#通过SOCKET通信,互传结构体。好处是可以把协议及要传送的内容封装成一个结构体,一次性发送,不需要再做过多的封包的拆包。封包过程通过的做法是把要发送的内容组成字...
  • ghs79
  • ghs79
  • 2015-09-30 18:26:47
  • 1132
收藏助手
不良信息举报
您举报文章:C#通过TCP传送结构体
举报原因:
原因补充:

(最多只允许输入30个字)