Changeset 7631
- Timestamp:
- Nov 10, 2010, 3:35:39 PM (14 years ago)
- Location:
- code/branches/masterserver
- Files:
-
- 5 edited
- 2 moved
Legend:
- Unmodified
- Added
- Removed
-
code/branches/masterserver/data/gui/scripts/MultiplayerMenu.lua
r7163 r7631 129 129 end 130 130 131 132 -- same as above, but use WAN Discovery 133 function P.showServerList() 134 local listbox = winMgr:getWindow("orxonox/MultiplayerListbox") 135 CEGUI.toListbox(listbox):resetList() 136 local discovery = orxonox.WANDiscovery:getInstance() 137 discovery:discover() 138 P.serverList = {} 139 local index = 0 140 local servername = "" 141 local serverip = "" 142 while true do 143 servername = discovery:getServerListItemName(index) 144 if servername == "" then 145 break 146 end 147 serverip = discovery:getServerListItemIP(index) 148 if serverip == "" then 149 break 150 end 151 table.insert(P.serverList, {servername, serverip}) 152 index = index + 1 153 end 154 index = 1 155 for k,v in pairs(P.serverList) do 156 local item = CEGUI.createListboxTextItem( v[1] .. ": " .. v[2] ) 157 item:setID(index) 158 index = index + 1 159 item:setSelectionBrushImage(menuImageSet, "MultiListSelectionBrush") 160 CEGUI.toListbox(listbox):addItem(item) 161 end 162 end 163 131 164 return P 132 165 -
code/branches/masterserver/src/libraries/network/CMakeLists.txt
r7490 r7631 32 32 LANDiscoverable.cc 33 33 LANDiscovery.cc 34 WANDiscovery.cc 35 MasterServerComm.cc 34 36 NetworkFunction.cc 35 37 Host.cc … … 54 56 LANDiscoverable.h 55 57 LANDiscovery.h 58 WANDiscovery.h 59 MasterServerComm.h 56 60 NetworkFunction.h 57 61 NetworkPrecompiledHeaders.h -
code/branches/masterserver/src/libraries/network/MasterServerComm.cc
r7630 r7631 27 27 */ 28 28 29 #include <cstdlib>30 #include <cstdio>31 #include <cstring>32 #include <enet/enet.h>33 29 #include "MasterServerComm.h" 34 30 35 MasterServerComm::MasterServerComm() 31 namespace orxonox 36 32 { 37 /* initialize Enet */ 38 if (enet_initialize () != 0) 39 { fprintf (stderr, "An error occurred while initializing ENet.\n"); 40 exit(EXIT_FAILURE); 41 } 42 atexit (enet_deinitialize); 43 44 45 /* initiate the client */ 46 this->client = enet_host_create( NULL /* create a client host */, 47 1, 48 2, /* allow up 2 channels to be used, 0 and 1 */ 49 0, 50 0 ); 51 52 /* see if it worked */ 53 if (this->client == NULL) 54 { fprintf (stderr, 55 "An error occurred while trying to create an ENet client host.\n"); 56 exit (EXIT_FAILURE); 57 } 58 } 59 60 MasterServerComm::~MasterServerComm() 61 { 62 enet_host_destroy(this->client); 63 } 64 65 int 66 MasterServerComm::connect( char *address, unsigned int port ) 67 { 68 /* Connect to address:port. */ 69 enet_address_set_host( &this->address, address ); 70 this->address.port = port; 71 72 /* Initiate the connection, allocating the two channels 0 and 1. */ 73 this->peer = enet_host_connect(this->client, &this->address, 2, 0); 74 75 if (this->peer == NULL ) 76 { fprintf( stderr, 33 34 MasterServerComm::MasterServerComm() 35 { /* nothing anymore, everything's been outsourced to 36 * the initialize method to facilitate debugging 37 */ 38 } 39 40 41 int MasterServerComm::initialize() 42 { 43 /* initialize Enet */ 44 if (enet_initialize () != 0) 45 { COUT(1) << "An error occurred while initializing ENet.\n"; 46 return 1; 47 } 48 49 /* install atexit handler for enet */ 50 atexit( enet_deinitialize ); 51 52 53 /* initiate the client */ 54 this->client = enet_host_create( NULL /* create a client host */, 55 1, 56 2, /* allow up 2 channels to be used, 0 and 1 */ 57 0, 58 0 ); 59 60 /* see if it worked */ 61 if (this->client == NULL) 62 { COUT(1) << "An error occurred while trying to create an ENet client host.\n"; 63 return 1; 64 } 65 } 66 67 MasterServerComm::~MasterServerComm() 68 { 69 /* destroy the enet facilities */ 70 enet_host_destroy(this->client); 71 } 72 73 int MasterServerComm::connect( char *address, unsigned int port ) 74 { 75 /* Connect to address:port. */ 76 enet_address_set_host( &this->address, address ); 77 this->address.port = port; 78 79 /* Initiate the connection, allocating the two channels 0 and 1. */ 80 this->peer = enet_host_connect(this->client, &this->address, 2, 0); 81 82 if (this->peer == NULL ) 83 { fprintf( stderr, 77 84 "No available peers for initiating an ENet connection.\n"); 78 85 //exit (EXIT_FAILURE); 79 86 return -1; 80 } 81 82 /* Wait up to 2 seconds for the connection attempt to succeed. */ 83 if (enet_host_service (this->client, &this->event, 2000) > 0 && 84 this->event.type == ENET_EVENT_TYPE_CONNECT ) 85 fprintf( stdout, "Connection to server succeeded." ); 86 else 87 { 88 enet_peer_reset (this->peer); 89 fprintf( stdout, "Connection to %s failed.", address ); 87 } 88 89 /* Wait up to 2 seconds for the connection attempt to succeed. */ 90 if (enet_host_service (this->client, &this->event, 2000) > 0 && 91 this->event.type == ENET_EVENT_TYPE_CONNECT ) 92 fprintf( stdout, "Connection to server succeeded." ); 93 else 94 { 95 enet_peer_reset (this->peer); 96 fprintf( stdout, "Connection to %s failed.", address ); 97 //exit(EXIT_FAILURE); 98 return -1; 99 } 100 101 return 0; 102 } 103 104 int MasterServerComm::pollForReply( int (*callback)( char*, ENetEvent* ) ) 105 { 106 /* see whether anything happened */ 107 if( enet_host_service( this->client, &this->event, 100 ) >= 0 ) 108 { 109 /* address buffer */ 110 char *addrconv = NULL; 111 112 /* check what type of event it is and react accordingly */ 113 switch (this->event.type) 114 { /* new connection, not supposed to happen. */ 115 case ENET_EVENT_TYPE_CONNECT: break; 116 117 /* disconnect */ 118 case ENET_EVENT_TYPE_DISCONNECT: /* ?? */ break; 119 120 /* incoming data */ 121 case ENET_EVENT_TYPE_RECEIVE: 122 addrconv = (char *) calloc( 50, 1 ); 123 enet_address_get_host_ip( &(this->event.peer->address), addrconv, 49 ); 124 125 /* DEBUG */ 126 printf( "A packet of length %u containing %s was " 127 "received from %s on channel %u.\n", 128 this->event.packet->dataLength, 129 this->event.packet->data, 130 addrconv, 131 this->event.channelID ); 132 /* END DEBUG */ 133 134 /* call the supplied callback, if any. */ 135 if( (*callback) != NULL ) 136 (*callback)( addrconv, &(this->event) ); 137 138 enet_packet_destroy( event.packet ); 139 if( addrconv ) free( addrconv ); 140 break; 141 default: break; 142 } 143 144 /* event handled, return 0 */ 145 return 0; 146 } 147 148 /* show that no event occured */ 149 return 1; 150 } 151 152 int MasterServerComm::sendRequest( char *data ) 153 { 154 /* send the data to the friend */ 155 /* Create a reliable packet of size 7 containing "packet\0" */ 156 ENetPacket * packet = enet_packet_create( data, 157 strlen( data ) + 1, 158 ENET_PACKET_FLAG_RELIABLE); 159 160 /* Send the packet to the peer over channel id 0. */ 161 enet_peer_send (this->peer, 0, packet); 162 163 /* One could just use enet_host_service() instead. */ 164 enet_host_flush( this->client ); 165 if( packet ) free( packet ); 166 } 167 168 } 169 170 171 /* DON'T DELETE THIS I MIGHT NEED IT AGAIN -smerkli */ 172 /* not needed anymore, only here for testing purposes */ 173 /* 174 //[> sample callback to output debugging info. <] 175 //int callb( char *addr, ENetEvent *ev ) 176 //{ 177 //printf( "A packet of length %u containing %s was " 178 //"received from %s on channel %u.\n", 179 //ev->packet->dataLength, 180 //ev->packet->data, 181 //addr, 182 //ev->channelID ); 183 //return 0; 184 //} 185 186 //[> small testing implementation <] 187 //int 188 //main( int argc, char *argv[] ) 189 //{ 190 //[> setup object and connect <] 191 //MasterServerComm msc = MasterServerComm(); 192 //if( msc.connect( argv[1], 1234 ) ) 90 193 //exit(EXIT_FAILURE); 91 return -1;92 }93 94 return 0;95 }96 97 int98 MasterServerComm::pollForReply( int (*callback)( char*, ENetEvent* ) )99 {100 if( enet_host_service( this->client, &this->event, 100 ) >= 0 )101 {102 char *addrconv = NULL;103 /* check what type of event it is and react accordingly */104 switch (this->event.type)105 { /* new connection, not supposed to happen. */106 case ENET_EVENT_TYPE_CONNECT: break;107 108 /* disconnect */109 case ENET_EVENT_TYPE_DISCONNECT:110 /* ?? */ break;111 112 /* incoming data */113 case ENET_EVENT_TYPE_RECEIVE:114 addrconv = (char *) calloc( 50, 1 );115 enet_address_get_host_ip( &(this->event.peer->address), addrconv, 49 );116 117 /* DEBUG */118 printf( "A packet of length %u containing %s was "119 "received from %s on channel %u.\n",120 this->event.packet->dataLength,121 this->event.packet->data,122 addrconv,123 this->event.channelID );124 /* END DEBUG */125 126 /* call the supplied callback, if any. */127 if( (*callback) != NULL )128 (*callback)( addrconv, &(this->event) );129 130 enet_packet_destroy( event.packet );131 if( addrconv ) free( addrconv );132 break;133 default: break;134 }135 }136 194 137 return 0; 138 } 139 140 int 141 MasterServerComm::sendRequest( char *data ) 142 { 143 /* send the data to the friend */ 144 /* Create a reliable packet of size 7 containing "packet\0" */ 145 ENetPacket * packet = enet_packet_create( data, 146 strlen( data ) + 1, 147 ENET_PACKET_FLAG_RELIABLE); 148 149 /* Send the packet to the peer over channel id 0. */ 150 enet_peer_send (this->peer, 0, packet); 151 152 /* One could just use enet_host_service() instead. */ 153 enet_host_flush( this->client ); 154 if( packet ) free( packet ); 155 } 156 157 /* sample callback to output debugging info. */ 158 int callb( char *addr, ENetEvent *ev ) 159 { 160 printf( "A packet of length %u containing %s was " 161 "received from %s on channel %u.\n", 162 ev->packet->dataLength, 163 ev->packet->data, 164 addr, 165 ev->channelID ); 166 return 0; 167 } 168 169 /* small testing implementation */ 170 int 171 main( int argc, char *argv[] ) 172 { 173 /* setup object and connect */ 174 MasterServerComm msc = MasterServerComm(); 175 if( msc.connect( argv[1], 1234 ) ) 176 exit(EXIT_FAILURE); 177 178 /* send some data and poll for replies */ 179 char *theinput = (char *)calloc( 100,1 ); 180 while( true ) 181 { 182 fgets( theinput, 90, stdin ); 183 if( !strncmp( theinput, "quit", 4 ) ) 184 break; 185 186 msc.sendRequest( theinput ); 187 msc.pollForReply( &callb ); 188 } 189 190 } 195 //[> send some data and poll for replies <] 196 //char *theinput = (char *)calloc( 100,1 ); 197 //while( true ) 198 //{ 199 //fgets( theinput, 90, stdin ); 200 //if( !strncmp( theinput, "quit", 4 ) ) 201 //break; 202 203 //msc.sendRequest( theinput ); 204 //msc.pollForReply( &callb ); 205 //} 206 207 //} 208 */ -
code/branches/masterserver/src/libraries/network/MasterServerComm.h
r7629 r7631 27 27 */ 28 28 29 class MasterServerComm 29 #include <cstdlib> 30 #include <cstdio> 31 #include <cstring> 32 #include <enet/enet.h> 33 34 namespace orxonox 30 35 { 31 public: 32 /** constructor */ 33 MasterServerComm(); 36 class MasterServerComm 37 { 38 public: 39 /** constructor */ 40 MasterServerComm(); 34 41 35 /** destructor */36 ~MasterServerComm();42 /** destructor */ 43 ~MasterServerComm(); 37 44 38 39 /** \param address Address to connect to (Host name or IP in text form) 40 * \param port Port to connect on 41 * \return 0 for success, other for error 42 * 43 * Connect to the master server with the given address on the given port. 44 */ 45 int connect( char *address, unsigned int port ); 46 47 /** \param data The data to be sent. 48 * \return 0 for success, other for error. 49 * 50 * Send a request to the master server containing data specified in data 51 */ 52 int sendRequest( char *data ); 53 54 /** \param callback The callback function to call with data receivced. 55 * \return 0 for success, other for error 56 * 57 * Poll the master server for new data and act accordingly */ 58 int pollForReply( int (*callback)( char*, ENetEvent* ) ); 59 60 private: 61 /* client handle */ 62 ENetHost *client; 63 ENetEvent event; 64 65 ENetAddress address; 66 ENetPeer *peer; 45 /** \return 0 for success, other for error 46 * 47 * Initialize everything for the master server communication 48 */ 49 int initialize(); 67 50 68 51 69 }; 52 /** \param address Address to connect to (Host name or IP in text form) 53 * \param port Port to connect on 54 * \return 0 for success, other for error 55 * 56 * Connect to the master server with the given address on the given port. 57 */ 58 int connect( char *address, unsigned int port ); 59 60 /** \param data The data to be sent. 61 * \return 0 for success, other for error. 62 * 63 * Send a request to the master server containing data specified in data 64 */ 65 int sendRequest( char *data ); 66 67 /** \param callback The callback function to call with data receivced. 68 * \return 0 for success, other for error 69 * 70 * Poll the master server for new data and act accordingly */ 71 int pollForReply( int (*callback)( char*, ENetEvent* ) ); 72 73 private: 74 /** client handle */ 75 ENetHost *client; 76 77 /** event data holder */ 78 ENetEvent event; 79 80 /** address holder */ 81 ENetAddress address; 82 83 /** peer data holder */ 84 ENetPeer *peer; 85 }; 86 87 } -
code/branches/masterserver/src/libraries/network/WANDiscovery.cc
r7630 r7631 21 21 * 22 22 * Author: 23 * Fabian 'x3n' Landau 23 * Fabian 'x3n' Landau (original) 24 24 * Co-authors: 25 * Sandro 'smerkli' Merkli (adaptions to WAN) 25 26 * ... 26 27 * … … 42 43 WANDiscovery::WANDiscovery() 43 44 { 45 /* create master server communications object */ 46 this->msc = MasterServerComm(); 47 48 /* initialize it and see if it worked */ 49 if( msc.initialize() ) 50 COUT(1) << "Error: could not initialize master server communications!\n"; 51 52 /* connect and see if it worked */ 53 if( msc.connect( MS_ADDRESS, 1234 ) ) 54 COUT(1) << "Error: could not connect to master server!\n"; 44 55 } 45 56 46 57 WANDiscovery::~WANDiscovery() 47 { 58 { 59 /* clear server list */ 60 this->servers_.clear(); 48 61 } 49 62 63 /* callback for the network reply poller */ 64 /* NOTE implement protocol-specific part here. */ 65 int replyhandler( char *addr, ENetEvent *ev ) 66 { 67 /* handle incoming data 68 * if a list entry arrives add to list 69 * if a done entry arrives set done to true 70 */ 71 72 /* done handling, return all ok code 0 */ 73 return 0; 74 } 75 50 76 void WANDiscovery::discover() 51 77 { 78 /* clear list */ 52 79 this->servers_.clear(); 80 81 /* send request to server */ 82 msc.sendRequest( MSPROTO_CLIENT MSPROTO_REQ_LIST ); 83 84 /* deal with replies */ 85 while( msc.pollForReply( replyhandler ) ) 86 /* nothing */; 87 88 /* done receiving. */ 53 89 } 54 90 55 91 std::string WANDiscovery::getServerListItemName(unsigned int index) 56 92 { 57 93 /* if the index is out of range, return empty */ 94 if( index >= this->servers_.size() ) 95 return BLANKSTRING; 96 else 97 /* else return the name of the server */ 98 return this->servers_[index].getServerName(); 58 99 } 59 100 60 101 std::string WANDiscovery::getServerListItemIP(unsigned int index) 61 102 { 62 103 /* if the index is out of range, return empty */ 104 if( index >= this->servers_.size() ) 105 return BLANKSTRING; 106 else 107 /* else return the IP of the server */ 108 return this->servers_[index].getServerIP(); 63 109 } 64 110 -
code/branches/masterserver/src/libraries/network/WANDiscovery.h
r7630 r7631 33 33 #include "packet/ServerInformation.h" 34 34 #include "util/Singleton.h" 35 #include "MasterServerComm.h" 35 36 36 37 #include <vector> 38 39 /* master server address (to be moved elsewhere later) */ 40 #define MS_ADDRESS "localhost" 41 42 /* protocol (to be moved elsewhere later) */ 43 #define MSPROTO_CLIENT "CL " 44 #define MSPROTO_REQ_LIST "REQ:LIST" 37 45 38 46 // tolua_begin … … 46 54 friend class Singleton<WANDiscovery>; 47 55 public: 56 /** constructor */ 48 57 WANDiscovery(); 58 59 /** destructor */ 49 60 ~WANDiscovery(); 61 62 /** ask server for server list */ 50 63 void discover(); // tolua_export 64 65 /** \param index Index to get the name of 66 * \return The name of the server 67 * 68 * Get the name of the server at index index. 69 */ 51 70 std::string getServerListItemName( unsigned int index ); // tolua_export 71 72 /** \param index Index to get the IP of 73 * \return The IP of the server 74 * 75 * Get the IP of the server at index index. 76 */ 52 77 std::string getServerListItemIP( unsigned int index ); // tolua_export 53 static WANDiscovery& getInstance(){ return Singleton<WANDiscovery>::getInstance(); } // tolua_export 78 79 /** \return an instance of WANDiscovery 80 * 81 * Create and return an instance of WANDiscovery. 82 */ 83 static WANDiscovery& getInstance() { return Singleton<WANDiscovery>::getInstance(); } // tolua_export 54 84 55 85 private: 86 /** Singleton pointer */ 56 87 static WANDiscovery* singletonPtr_s; 57 ENetHost* host_; 88 89 /** Master server communications object */ 90 MasterServerComm msc; 91 92 /** game server list */ 58 93 std::vector<packet::ServerInformation> servers_; 94 59 95 }; // tolua_export 60 96 -
code/branches/masterserver/src/modules/masterserver/ServerList.h
r7568 r7631 69 69 70 70 71 /* SORTING */71 /* SORTING (to be implemented) */ 72 72 73 73 /** sort by name */
Note: See TracChangeset
for help on using the changeset viewer.