其他分享
首页 > 其他分享> > 游戏服务器中对于发包/收包的个人理解

游戏服务器中对于发包/收包的个人理解

作者:互联网

TCP

包体长度 包体数据

······很简单明了,也是我们初学网络编程是所用的结构。那么思考一下,我们发包需要什么信息呢?
其实我们只需两个信息,已发送长度数据包大小。那么结构就变成了

包体信息(已发送长度 + 数据包大小) 包体数据(包长 + 数据)

······有些人可能这里就疑惑了,不是包体数据里面有个包长数据吗?为什么还要多一个数据包大小,呵呵,不要着急。我们接下来慢慢说

我自己定的包体结构是这样的

namespace network::tcp {
#pragma pack(push)
#pragma pack(1)
	/*
	包体信息
	存储结构:包体信息 + 报文结构
	报文结构: 包头结构 + 包体 + 包尾结构
	*/
	struct pack_info {
		slen_t	slen;	//发送长度
		slen_t	len;	//包长
	};

	/*
	包头结构
	报文结构: 包头结构 + 包体 + 包尾结构
	*/
	struct head_pack {
		char	head;	//包头标识符
		slen_t	len;	//包长
	};

	/*
	包尾结构
	报文结构: 包头结构 + 包体 + 包尾结构
	*/
	struct tail_pack {
		slen_t	len;	//包长
		char	tail;	//包尾标识符
	};
#pragma pack(pop)
}

至于为何包尾也要加个包长,还有为什么需要头尾两端的标识符,大家思考一下?

包体信息(已发送长度 + 数据包大小) 包体数据([包头+ 包体 + 包尾] + [包头+ 包体 + 包尾] + …)

怎么样,这下就知道我们最开始为什么需要包体信息中的数据包大小了吧,因为它是代表整个数据包大小的数据,而不是单个数据包。虽然单个数据包的包头信息中包含了包长数据。但是它只代表了自身的大小。

······我们就是根据优先级来获取最大堆中指定的优先级消息队列,如果没有则创建一个新的消息队列并加入最大堆。再向指定的优先级消息队列中添加我们插入的发送数据。等到发送的时候再取出使用,发送完成后再删除消息队列中的发送数据。如果消息队列为空了,那么就把它从最大堆中移除。这样就能保证最大堆的顶部一直都是消息优先级最高的数据。


udp

还没开始写呢。别着急,等个十年八年就出来了

标签:收包,标识符,包长,包尾,发包,包头,服务器,数据包,包体
来源: https://blog.csdn.net/qq_28398301/article/details/106324867