Server.h
上传用户:jxpjxmjjw
上传日期:2009-12-07
资源大小:5877k
文件大小:4k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. // Copyright (C) 2004 Team Python
  2. //  
  3. // This program is free software; you can redistribute it and/or modify
  4. // it under the terms of the GNU General Public License as published by
  5. // the Free Software Foundation; either version 2 of the License, or
  6. // (at your option) any later version.
  7. // 
  8. // This program is distributed in the hope that it will be useful,
  9. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. // GNU General Public License for more details.
  12. // 
  13. // You should have received a copy of the GNU General Public License
  14. // along with this program; if not, write to the Free Software 
  15. // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  16. #ifndef WOWPYTHONSERVER_SERVER_H
  17. #define WOWPYTHONSERVER_SERVER_H
  18. #include "Common.h"
  19. #include "Singleton.h"
  20. #include "Network.h"
  21. #define CF_DEAD 1
  22. #define RSERVER 0
  23. #define RCLIENT   1
  24. #define PF_READ   1
  25. #define PF_WRITE  2
  26. #define PF_EXCEPT 4
  27. class Client;
  28. class Server  {
  29. public:
  30.     /// Constructor
  31.     Server( ) : mActive( false ) { }
  32.     /// Destructor
  33.     ~Server( ) { }
  34.     /// Initialisation
  35.     void Initialise(unsigned int port, char* type );
  36.     /// Begin listening for client connections
  37.     void StartThreaded( );
  38.     /// Stop accepting connections and disconnect all clients
  39.     void Stop( );
  40.     void Start( );
  41.     //void StopWorld( );
  42. virtual void eventStart( ) { }
  43. virtual void eventStop( ) { }
  44.     struct nlink
  45.     {
  46.         struct nlink *next;
  47.         struct nlink *prev;
  48.         int fd;
  49.         int flags;
  50.         int type;
  51.     };
  52.     struct nlink_server
  53.     {
  54.         struct nlink hdr;
  55.     };
  56.     struct nlink_client
  57.     {
  58.         struct nlink hdr;
  59.         Client *pClient;
  60.     };
  61.     struct nlinklist
  62.     {
  63.         struct nlink *head;
  64.         struct nlink *tail;
  65.     };
  66.     void nlink_insert(struct nlink *nptr)
  67.     {
  68.         nptr->prev = g_netlink->tail;
  69.         nptr->next = NULL;
  70.         if(g_netlink->tail)
  71.             g_netlink->tail->next = nptr;
  72.         else
  73.             g_netlink->head = nptr;
  74.         g_netlink->tail = nptr;
  75.     }
  76.     struct nlink * nlink_remove(struct nlink *nptr)
  77.     {
  78.         struct nlink *fptr;
  79.         fptr = nptr;
  80.         nptr = nptr->next;
  81.         if(fptr->next)
  82.             fptr->next->prev = fptr->prev;
  83.         else
  84.             g_netlink->tail = fptr->prev;
  85.         if(fptr->prev)
  86.             fptr->prev->next = fptr->next;
  87.         else
  88.             g_netlink->head = fptr->next;
  89.         free(fptr);
  90.         return nptr;
  91.     }
  92.     void nlink_init()
  93.     {
  94.         g_netlink->tail = NULL;
  95.         g_netlink->head = NULL;
  96.     }
  97.     struct nlink * getHead() { return g_netlink->head; }
  98.     virtual void server_sockevent(struct nlink_server *cptr, unsigned short revents, void * myNet);
  99.     virtual void client_sockevent(struct nlink_client *cptr, unsigned short revents) {}
  100.     virtual void disconnect_client( struct nlink_client *cptr ) {
  101.     // nlink_remove((nlink *)cptr);
  102.     cptr->hdr.flags |= CF_DEAD;
  103.     }
  104. protected:
  105. struct nlinklist g_netlink[1];
  106.     virtual void Update( uint32 time ) { }
  107.     /// Convenience pointer to the network singleton
  108.     Network * mNetwork;
  109.     /// Port this server is listening on
  110.     int mPort;
  111.     /// Is this server accepting connections?
  112.     bool mActive;
  113.     /// Has this server been instructed to stop?
  114.     bool mStop;
  115.     char * mType;
  116.     static THREADCALL MainLoop( void * myServer );
  117. typedef std::set< Client * > ClientSet;
  118. ClientSet mClients;
  119. private:
  120.     float mLastTime;
  121. uint32 mLastTicks;
  122. };
  123. #endif