客户端使用C#开发的,服务器端是由C++开发的,今天同事给了我消息头,消息头如下:typedef struct
{
    MSG_Type_t      type;//1个字节(sms值)
    termNbr_t     dstNbr;//20个字节
    uint_32         seqnum;//4个字节
    int             len;    //4个字节
}__PACKED SMS_t;消息的主体就是一个字符串,而且头跟主体是一次发送到服务器端的,
现在我有如下的一些问题:
1.同事跟我说字节方面的问题,提到了字节对齐,请问我用C#做的时候,要做特殊处理吗?
2.同事给我的是一个结构体,我发送过去的时候要怎么组织了?比如
      Byte[] bytesSent = Encoding.ASCII.GetBytes("234");
  我是不是只要把上面结构体中内容都GetBytes一下,然后+在一起发过去就可以了,如:
      Byte[] bytes1= Encoding.ASCII.GetBytes(smst.type);
  这样加在一起是不是就会有字节对齐的问题,另外,我能不能也做一个结构体,发送的时候直接发?如果可以,要怎么做了?3.消息头跟消息的主体要一起发送过去,我是不是就是把消息体GetBytes一下,然后接到消息头的后面就可以了?谢谢大家,新手,请大家指点下。。

解决方案 »

  1.   

    这个结构体就是协议,你俩统一一下格式,例如(逗号分隔,分号结束),通过数组传过去就可以了
    socket不直接发结构体
      

  2.   

    typedef struct 

        MSG_Type_t      type;//1个字节(sms值) 
        termNbr_t     dstNbr;//20个字节 
        uint_32        seqnum;//4个字节 
        int            len;    //4个字节 
    }__PACKED SMS_t; 
    根据协议,type 是消息类型,你要有 MSG_Type_t 的类型定义才好,
    而且类型中的数值,也和C++的一样。
    dstNbr, 就是 20个字节,是什么数据就不清楚了(难道是团队编号?),这是 termNbr_t 类型的数据,同上。
     
    seqnum 是 无类型整数,没有关系了,只要是4个字节的整数就好了。
    len 长度,也许是接下来的数据长度。
      

  3.   

    看要求是否需要对齐,和非托管的通讯,可以定义[StructLayout(LayoutKind.Sequential)] 头。
      

  4.   

    那消息主体是不是转成byte后要怎么跟消息头一起发过去了?
      

  5.   

    typedef struct 

        MSG_Type_t      type;//1个字节(sms值) 
        termNbr_t    dstNbr;//20个字节 
        uint_32        seqnum;//4个字节 
        int            len;    //4个字节 
    }__PACKED SMS_t; MSG_Type_t  是char类型的
    termNbr_t   是char类型的数组
      

  6.   

    3.消息头跟消息的主体要一起发送过去,我是不是就是把消息体GetBytes一下,然后接到消息头的后面就可以了?这个问题如何解决了?
      

  7.   

    就是弄一个大个的byte[],按照你们商量好的协议往里边填充数据后发送就可以了。
    其实呢,按照你们商量好的协议发送就可以了,比如说,你们的协议是 [消息头][主体],那么你先把消息头的byte[] 发送出去,然后再把主体的byte[]发送出去就可以了。只要数据发送的顺序跟协议一致就可以。
    另外,你有可能需要把c#中的结构体的定义的对齐方式改为1.
      

  8.   

    看你的消息头占用了29个字节的长度,你其实不用管那个结构体,看起来方便而已,关键是需要知道发送的字节数组中,前29个字节存放的消息头顺序,如果顺着它的结构体来,那么就是:
    byte[0] = type;
    byte[1]~byte[20] = dstNbr;
    byte[21]~byte[24] = seqnum;
    byte[25]~byte[28] = len;
    接着byte[29]开始就存放消息主体,当然这也符合字节对其,因为前29个字节位都是固定的功能。