/* core/netserver.h This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #ifndef __INCLUDED_CORE_NETSERVER_H__ #define __INCLUDED_CORE_NETSERVER_H__ #ifndef _WIN32 #include #else #include #endif #include #include #include "core/net.h" #include "core/netclient.h" #include "core/player.h" #include "core/info.h" namespace core { /// network server class NetServer { public: /// type definition for a list of network clients typedef std::list Clients; /// create a new network server, listening on host:port NetServer(std::string const host, unsigned int const port); /// disconnect clients and shutdown the network server ~NetServer(); /*----- inspectors ------------------------------------------------ */ /// Returns true if the TCP server has a valid file descriptor inline bool valid() const { return netserver_fd != -1; } /// Returns true if the TCP server has an invalid file descriptor inline bool invalid() const { return netserver_fd == -1; } /// Returns the error state of the TCP server inline bool error() const { return netserver_error; } /// Return the socket file descriptor inline int fd() const { return netserver_fd; } /*----- mutators -------------------------------------------------- */ /// run a network server frame void frame(unsigned long timestamp); /// receive data from clients void receive(); /// disconnect a client void send_disconnect(NetClient *client); /// find the client corresponding to a player NetClient *find_client(Player const *player); protected: /// send a message void send_message(NetClient *client, const char *channel, std::string const & message); /// send a server frame marker void send_frame_marker(NetClient *client, unsigned long timestamp); /// send a create entity event void send_entity_create(NetClient *client, Entity *entity); /// broadcast a delete entity event void send_entity_delete(NetClient *client, Entity *entity); /// broadcast a update entity event void send_entity_update(NetClient *client, Entity *entity); /// send a zone update event void send_zone_update(NetClient *client, Zone *zone); /// send an update player information message void send_player_update(NetClient *client); /// send an general update player information message void send_player_update(NetClient *client, Player *player); /// send player disconnect information message void send_player_disconnect_info(NetClient *client, Player *player); /// send player an info record void send_info_update(NetClient *client, Info *info); /// set the error state void abort(); /// called when a new client connects NetClient *client_connect(std::string const host, int const port); /// called when a client has send the intial handshake void client_initialize(NetClient *client); /// remove terminated clients void reap(); /// parse incoming client messages void parse_incoming_message(NetClient *client, const std::string & message); /// send a server frame to a single client void client_frame(NetClient *client, unsigned long timestamp); private: bool netserver_error; int netserver_fd; struct sockaddr_in netserver_addr; fd_set serverset; int fdmax; char recbuf[FRAMESIZE]; Clients clients; }; } #endif // __INCLUDED_CORE_NETSERVER_H__