游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2163|回复: 8

这样的消息头设计合适吗?

[复制链接]

14

主题

166

帖子

171

积分

注册会员

Rank: 2

积分
171
发表于 2006-10-18 21:47:00 | 显示全部楼层 |阅读模式
struct TMsgHead
{
        int        userID;                                                       
        unsigned char type;        //消息的基础类型        一级编号        用于分大类        Byte
        unsigned char ID;        //消息的类型        二级编号        用于分细节
        int len;                //整个消息的长度,包括消息头和消息内容
};

例如一个购买道具的消息
type = TradeMsg
ID    = Buy

然后在TMsgHead结构体后面跟一个
struct buyMsqReq
{
int goodsID;
int num;
}

一个结构体,在里面定义购买的货物的编号以及数量。
在数据发送的时候,将这两个结构体的内容copy在一起,加上消息的结尾标志发送给服务器。

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2006-10-18 22:38:00 | 显示全部楼层

Re:这样的消息头设计合适吗?

考虑下对齐吧,把int len换成u16 len就可以做到32bits对齐,另外id没必要用带符号的吧.
另外没必要给消息加结尾标记.

14

主题

166

帖子

171

积分

注册会员

Rank: 2

积分
171
 楼主| 发表于 2006-10-19 20:12:00 | 显示全部楼层

Re:这样的消息头设计合适吗?

tarkey 你的建议很好,len可以换为u16,做到32bit对齐
消息头的 type 和 id 都是无符号,TradeMsg,Buy 等消息都是用#define来定义,我想这样作应该没有什么问题。
至于消息结尾的标记主要是在socket通讯的时候,能够从数据包里准确的切割出消息。

对了,不知道 tarkey 你对服务器集群有没有了解,我在网上很少看到有关集群的介绍

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2006-10-19 20:19:00 | 显示全部楼层

Re:这样的消息头设计合适吗?

切出消息只要消息头和长度就够了

14

主题

166

帖子

171

积分

注册会员

Rank: 2

积分
171
 楼主| 发表于 2006-10-19 21:00:00 | 显示全部楼层

Re:这样的消息头设计合适吗?

如果这样的话,万一数据包里其中某一个包发生问题,那不会造成后面的包都会接收错误?

0

主题

202

帖子

202

积分

中级会员

Rank: 3Rank: 3

积分
202
发表于 2006-10-19 23:35:00 | 显示全部楼层

Re:这样的消息头设计合适吗?

要的,可以考虑对齐

27

主题

179

帖子

259

积分

中级会员

Rank: 3Rank: 3

积分
259
发表于 2006-10-20 00:14:00 | 显示全部楼层

Re:这样的消息头设计合适吗?

首先是TCP不会出错,UDP也不会产生包错误,最多数据丢失。
其次,假设会出错,如果出错在结尾的数据结构上,怎么办? 所以结尾的数据结构是没必要的。
最后,所有数据包是在IP layer 和 data link layer 都有做checksum,即使你在transport layer进行数据对其,到IP layer 和data link layer分包(TCP会分包,UDP是做fragmentation)或者分frame(data link layer)的时候,完全是操作系统决定的,到时候又不对齐。如果是为了提高checksum的效率,也无必要,因为现在的checksum都是网卡硬件做的,完全无速度上的影响。

但是数据头是有必要对齐的,这样在application layer处理速度更快。还有最好加上个消息头识别码,比如 UINT32 ProtocolID = 0xA0EFC755 ,在处理UDP包里很有用。

12

主题

88

帖子

133

积分

注册会员

Rank: 2

积分
133
发表于 2006-10-20 09:34:00 | 显示全部楼层

Re:这样的消息头设计合适吗?

你的消息分两层的好处在哪里?
这种好处与付出的代价衡量过吗?
struct TMsgHead
{
u32 userID; //连接号
u16 ID; //消息的类型
u16 len; //整个消息的长度,包括消息头和消息内容
}

这里len可要可不要

6

主题

471

帖子

1047

积分

金牌会员

Rank: 6Rank: 6

积分
1047
发表于 2006-10-20 16:09:00 | 显示全部楼层

Re:这样的消息头设计合适吗?

你的数据头大了点.而且没对齐.

typedef struct tagPACKET_HEADER{
     DWORD:8         Type;
     DWORD:8         Flag;
     DWORD:16       Size;
};
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 15:28

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表