数据包格式按照招标书要求,参考业界惯用的标准,采用TLV形式。
T(type )字段表示数据包类型,传输中定义为short类型;L(length)字段表示数据包长度(不包括类型和长度字段本身),传输中定义为long类型。T和L共同组成包头;V(value )表示数据包信息。Type占2字节
length占4字节
value为一个结构typedef  struct  Type_Struct_Frt_Vhc_Data
{
long     bid;             //
char     xxkbm[8];            // 
char     dkqbm[8];        //
char     cphm[12];        //
char     cpys;            //
char     clpp[4];            //
char     csys[3];         //
char     fdjh[16];         //
char     sd[4];          //
short     cdh;            //
long     sbsj[16];           //
char     sfhbc;            //
char     xcnjsj[16];        //
char     bcbz;           //
} Type_Struct_Frt_Vhc_Data;
包前后端分别加#和$做为包头和尾
服务端是C#
客户端是C/C++
请问有哪位大大能给个例子什么的让参考参考
主要是想知道服务端接到信息后如何处理粘包,解包并组包返回信息

解决方案 »

  1.   

    业界标准?哪一业的标准呢?对于跨平台的通讯,最近5~20年,xml才是标准。最近3~5年,json才是标准。
      

  2.   

    标准是认定的,语言是什么也无所谓,只要你能正确发包,并且服务端解包就可以了,包就是一个字节流,先读类型,然后读取长度,value值可以分段发送
      

  3.   

    就用SOCKET通讯吧:“#”+Type+length+Type_Struct_Frt_Vhc_Data+$
    传输的是BYTE数组,SOCKET通讯的好处是同步的,适合于实时通讯系统
      

  4.   

    那我是否可以按这种思路来我用headpack来返回头和尾部的#和$,分别返回的是一个字节的byte[]?
    static public Byte[] headpack(char head)
            {
                return BitConverter.GetBytes(head);
            }
    再用typepack返回一个2字节长度的type的byte[]
    static public Byte[] typepack(int type)
            {
                return BitConverter.GetBytes(type);
            }
    再用lengthpack返回一个4字节长度的length的byte[]
    static public Byte[] lengthpack(int length)
            {
                return BitConverter.GetBytes(length);
            }
    再用StructToBytes将结构体转换成byte[]
    public static byte[] StructToBytes(object structObj) 
            { 
                int size = Marshal.SizeOf(structObj); 
                byte[] bytes = new byte[size]; 
                 IntPtr structPtr = Marshal.AllocHGlobal(size); 
                 Marshal.StructureToPtr(structObj, structPtr, false); 
                 Marshal.Copy(structPtr, bytes, 0, size); 
                 Marshal.FreeHGlobal(structPtr); 
                return bytes; 
             }
    最后把这些byte[]按顺序 #+Type+length+Type_Struct_Frt_Vhc_Data+$组合成一个新的byte[]
    再发送过去?
      

  5.   

    首先是你想发那一层的包举例来说
    如果你用现成的库发UDP包,而且你的组包是组的UDP包的data部分,那么不管你怎么组,只要不越界,总是能发出去的
    而组包和解包实际是byte数组或者字符串的处理如果是MAC帧,哼哼,考虑的东西就多喽
    多很多帧头和至少一个帧尾而如果你说的那些数据是一个数据包data部分的全部数据,那么其实不需要在头和尾上加标示