客户端使用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一下,然后接到消息头的后面就可以了?谢谢大家,新手,请大家指点下。。
{
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一下,然后接到消息头的后面就可以了?谢谢大家,新手,请大家指点下。。
socket不直接发结构体
{
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 长度,也许是接下来的数据长度。
{
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类型的数组
其实呢,按照你们商量好的协议发送就可以了,比如说,你们的协议是 [消息头][主体],那么你先把消息头的byte[] 发送出去,然后再把主体的byte[]发送出去就可以了。只要数据发送的顺序跟协议一致就可以。
另外,你有可能需要把c#中的结构体的定义的对齐方式改为1.
byte[0] = type;
byte[1]~byte[20] = dstNbr;
byte[21]~byte[24] = seqnum;
byte[25]~byte[28] = len;
接着byte[29]开始就存放消息主体,当然这也符合字节对其,因为前29个字节位都是固定的功能。