上一篇 說了問題。現(xiàn)在說說重構(gòu)后的構(gòu)架。
基于freebsd6.3 boost-1.35.0(多處升級(jí),最重要是包含了asio,升級(jí)了thread) STLport-5.1.5 消息隊(duì)列(msgget,msgsnd,msgrcv)
構(gòu)架方便借鑒了部分
云風(fēng)的思路。
loginserver,gate,gamedb,postoffice,mapserver
accountdb去掉了,整合進(jìn)loginserver里,loginserver直接連oracle,取列表信息后去連gate,gate連gamedb負(fù)責(zé)發(fā)人物列表

家里機(jī)器只有畫圖。。。忍著看吧。。。
下面開始都是一個(gè)服為一個(gè)單位。
一個(gè)服的gate是可以隨時(shí)開關(guān)的,gate起來的時(shí)候會(huì)給loginserver和postoffice注冊(cè)
1 struct GateInfo
2 {
3 char name[25];
4 char ip[16];
5 short port;
6 uint online;
7 };
8
9 typedef vector<GateInfo*> VecGateInfo;
10 VecGateInfo _gateinfo;
11
12 // 當(dāng)有用戶連上或者斷開gate時(shí)
13 sort(_gateinfo.begin(), _gateinfo.end(), GateSort)
14
15 // 這樣client取gate信息的時(shí)候只需要發(fā)給每個(gè)gate_group的第一個(gè)就行。
gamedb是所有userinfo的集結(jié)地,有緩存,只在第一次請(qǐng)求的時(shí)候把userinfo讀進(jìn)緩存,其余時(shí)刻都是寫,一個(gè)慢線程,5分鐘輪詢寫一遍,某個(gè)user更新發(fā)給gamedb,由gamedb負(fù)責(zé)通知其他拷貝同步更新。
mapserver實(shí)際上是一堆服務(wù)端的組合總稱,這塊來自云風(fēng)的構(gòu)架,分為chatserver(聊天服務(wù)端),mapserver(地圖服務(wù)端,還可以區(qū)分為只帶功能性npc地圖,或者稱為非pk地圖,和其他地圖),guildserver,dropserver。。。每個(gè)server都和postoffice連接,并且按功能和gamedb和其他服務(wù)端連接,按功能劃分具體的服務(wù)端可以很好的把邏輯分散,不會(huì)導(dǎo)致某個(gè)模塊的bug整個(gè)服務(wù)端的崩潰,在程序員整體調(diào)試水平不高的情況下,大大降低出錯(cuò)后分析的難度。
相比較以前來說就是gamedb后移,數(shù)據(jù)重心放在gamedb上,只讀一次的做法要嚴(yán)格保證gamedb的效率和穩(wěn)定,否則會(huì)死的很抽象。
一些細(xì)節(jié)mark下來,boost+asio在freebsd上居然不用kqueue用的是select。。。Orz,這是我在一次單步跟一個(gè)內(nèi)存錯(cuò)誤發(fā)現(xiàn)的
1 //
2 // kqueue_reactor_fwd.hpp
3 // ~~~~~~~~~~~~~~~~~~~~~~
4 //
5 // Copyright (c) 2003-2008 Christopher M. Kohlhoff (chris at kohlhoff dot com)
6 // Copyright (c) 2005 Stefan Arentz (stefan at soze dot com)
7 //
8 // Distributed under the Boost Software License, Version 1.0. (See accompanying
9 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
10 //
11
12 #ifndef BOOST_ASIO_DETAIL_KQUEUE_REACTOR_FWD_HPP
13 #define BOOST_ASIO_DETAIL_KQUEUE_REACTOR_FWD_HPP
14
15 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
16 # pragma once
17 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
18
19 #include <boost/asio/detail/push_options.hpp>
20
21 #if !defined(BOOST_ASIO_DISABLE_KQUEUE)
22 #if defined(__MACH__) && defined(__APPLE__)
23
24 // Define this to indicate that epoll is supported on the target platform.
25 #define BOOST_ASIO_HAS_KQUEUE 1
26
27 namespace boost {
28 namespace asio {
29 namespace detail {
30
31 template <bool Own_Thread>
32 class kqueue_reactor;
33
34 } // namespace detail
35 } // namespace asio
36 } // namespace boost
37
38 #endif // defined(__MACH__) && defined(__APPLE__)
39 #endif // !defined(BOOST_ASIO_DISABLE_KQUEUE)
40
41 #include <boost/asio/detail/pop_options.hpp>
42
43 #endif // BOOST_ASIO_DETAIL_KQUEUE_REACTOR_FWD_HPP
反正我只是不負(fù)責(zé)任的把22和38行屏蔽掉而已。
消息隊(duì)列只傳遞指針,意思就是某個(gè)消息由接收方alloc,然后msgsnd這塊內(nèi)存的指針,msgrcv收到這個(gè)指針,處理完了free掉,而不是整個(gè)消息放進(jìn)去。
1 struct mymsg {
2 long int mtype; /* message type */
3 char mtext[4]; /* message text */
4 }
5
說實(shí)話當(dāng)初在msgsnd msgrcv上調(diào)試了很久
1 char* packet;// 假設(shè)這個(gè)packet包括了傳進(jìn)來的包
2 mymsg* msg = (mymsg*)mem_alloc(sizeof(mymsg));
3 memcpy(msg->mtext, &packet, sizeof(char*));
4 msgsnd(msgid, msg, sizeof(char*),0)
然后死活提示參數(shù)不正確。。。
逐字逐句讀了man msgsnd數(shù)十遍之后發(fā)現(xiàn)。。。問題在msg->mtype不能等于0
ok,公司物理斷網(wǎng),usb口物理破壞。。。囧。。。當(dāng)然,我要起帶頭作用,忍。。。
posted on 2008-04-09 22:42
大日如來 閱讀(2339)
評(píng)論(2) 編輯 收藏 引用 所屬分類:
游戲-編程