MMORPG大型游戏设计与开发(part4 of net)
2014-11-09 10:07
381 查看
上一节简单的介绍了服务器消息处理的流程,想必大家对这方面有了初步的认识,接下来我们需要知道和掌握的便是其中一些重要的方法,进一步深入熟悉整个构架。
1、FD_*系列宏函数
FD_ZERO(fd_set *fdset) 将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在系统分配内存空间后,通常并不作清空处理,所以结果是不可知的。
FD_SET(fd_set *fdset) 用于在文件描述符集合中增加一个新的文件描述符。FD_CLR(fd_set *fdset) 用于在文件描述符集合中删除一个文件描述符。
FD_ISSET(int fd,fd_set *fdset) 用于测试指定的文件描述符是否在该集合中。
2、Socket操作类
packet_factorymanager
网络包工厂管理器,即是把所有包对象加入到一个管理器中,然后有需要的时候再从工厂中取出来使用。
5、服务器select模式
上一部分的代码中,大家应该也看到了这个代码。那么为什么要select呢?服务器一次普通阻塞之下,一次只能一对一的问答,如果多个同时访问,就要讲究先来后到了。为了避免这样的问题,解决多用户同时访问不需要等待,则使用了select模式。那么我们来看看这个函数的具体用法与解释,还是引用一个前人已经总结出来的文章:socket的select。
下一部分将用一个服务器的实例来讲诉网络部分一次访问的过程。
1、FD_*系列宏函数
FD_ZERO(fd_set *fdset) 将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在系统分配内存空间后,通常并不作清空处理,所以结果是不可知的。
FD_SET(fd_set *fdset) 用于在文件描述符集合中增加一个新的文件描述符。FD_CLR(fd_set *fdset) 用于在文件描述符集合中删除一个文件描述符。
FD_ISSET(int fd,fd_set *fdset) 用于测试指定的文件描述符是否在该集合中。
2、Socket操作类
/** * PAP Engine ( -- ) * $Id factorymanager.h * @link -- for the canonical source repository * @copyright Copyright (c) 2013-2013 viticm( viticm@126.com ) * @license * @user viticm<viticm@126.com> * @date 2014-1-3 10:11:38 * @uses server and client net packet factory manager */ #ifndef PAP_COMMON_NET_PACKET_FACTORYMANAGER_H_ #define PAP_COMMON_NET_PACKET_FACTORYMANAGER_H_ #include "common/net/config.h" #include "common/net/packet/factory.h" #include "common/sys/thread.h" namespace pap_common_net { namespace packet { class FactoryManager { public: FactoryManager(); ~FactoryManager(); public: uint32_t* packet_alloccount_; public: bool init(); //根据消息类型从内存里分配消息实体数据(允许多线程同时调用) Base* createpacket(uint16_t pakcetid); //根据消息类型取得对应消息的最大尺寸(允许多线程同时调用) uint32_t getpacket_maxsize(uint16_t packetid); //删除消息实体(允许多线程同时调用) void removepacket(Base* packet); void lock(); void unlock(); static bool isvalid_packetid(uint16_t id); //packetid is valid private: Factory** factories_; uint16_t size_; pap_common_sys::ThreadLock lock_; private: void addfactory(Factory* factory); void addfactories_for_billinglogin(); void addfactories_for_serverserver(); void addfactories_for_clientlogin(); void addfactories_for_loginworld(); void addfactories_for_serverworld(); void addfactories_for_clientserver(); }; }; //namespace packet }; //namespace pap_common_net extern pap_common_net::packet::FactoryManager* g_packetfactory_manager; #endif //COMMON_NET_PACKETFACTORY_H_
packet_factorymanager
网络包工厂管理器,即是把所有包对象加入到一个管理器中,然后有需要的时候再从工厂中取出来使用。
5、服务器select模式
上一部分的代码中,大家应该也看到了这个代码。那么为什么要select呢?服务器一次普通阻塞之下,一次只能一对一的问答,如果多个同时访问,就要讲究先来后到了。为了避免这样的问题,解决多用户同时访问不需要等待,则使用了select模式。那么我们来看看这个函数的具体用法与解释,还是引用一个前人已经总结出来的文章:socket的select。
下一部分将用一个服务器的实例来讲诉网络部分一次访问的过程。
相关文章推荐
- MMORPG大型游戏设计与开发(part6 of net)
- MMORPG大型游戏设计与开发(part5 of net)
- MMORPG大型游戏设计与开发(part6 of net)
- MMORPG大型游戏设计与开发(part3 of net)
- MMORPG大型游戏设计与开发(part3 of net)
- MMORPG大型游戏设计与开发(part5 of net)
- MMORPG大型游戏设计与开发(part4 of net)
- MMORPG大型游戏设计与开发(part5 of net)
- MMORPG大型游戏设计与开发(part3 of net)
- MMORPG大型游戏设计与开发(part4 of net)
- MMORPG大型游戏设计与开发(part6 of net)
- MMORPG大型游戏设计与开发(part1 of net)
- MMORPG大型游戏设计与开发(客户端架构 part15 of vegine)
- MMORPG大型游戏设计与开发(客户端架构 part9 of vegine)
- MMORPG大型游戏设计与开发(客户端架构 part7 of vegine)
- MMORPG大型游戏设计与开发(part1 of net)
- MMORPG大型游戏设计与开发(客户端架构 part4 of vegine)
- MMORPG大型游戏设计与开发(客户端架构 part6 of vegine)
- MMORPG大型游戏设计与开发(客户端架构 part16 of vegine)
- MMORPG大型游戏设计与开发(part2 of net)