Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/masterserver/src/libraries/network/MasterServerComm.cc @ 7692

Last change on this file since 7692 was 7692, checked in by smerkli, 14 years ago

done for today, didn't get bug to leave, and connect doesn't quite work yet.

File size: 6.8 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Sandro 'smerkli' Merkli
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#include "MasterServerComm.h"
30
31namespace orxonox
32{
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    /* initialize the event holder */
50    this->event = (ENetEvent *)calloc( sizeof(ENetEvent), 1 );
51   
52    /* install atexit handler for enet */
53    atexit( enet_deinitialize );
54
55
56    /* initiate the client */
57    this->client = enet_host_create( NULL /* create a client host */,
58        1,
59        2, /* allow up 2 channels to be used, 0 and 1 */
60        0, 
61        0 ); 
62
63    /* see if it worked */
64    if (this->client == NULL)
65    { COUT(1) << "An error occurred while trying to create an ENet client host.\n";
66      return 1;
67    }
68
69    return 0;
70  }
71
72  MasterServerComm::~MasterServerComm()
73  {
74    /* destroy the enet facilities */
75    enet_host_destroy(this->client);
76  }
77
78  int MasterServerComm::connect( char *address, unsigned int port )
79  {
80    /* Connect to address:port. */
81    enet_address_set_host( &this->address, address );
82    this->address.port = port;
83
84    /* Initiate the connection, allocating the two channels 0 and 1. */
85    this->peer = enet_host_connect(this->client, &this->address, 2, 0);   
86
87    if (this->peer == NULL )
88    { COUT(2) << "ERROR: No available peers for initiating an ENet connection.\n";
89    //exit (EXIT_FAILURE);
90    return -1;
91    }
92
93    /* Wait up to 2 seconds for the connection attempt to succeed. */
94    if (enet_host_service (this->client, this->event, 2000) > 0 &&
95        this->event->type == ENET_EVENT_TYPE_CONNECT )
96      fprintf( stdout, "Connection to server succeeded." );
97    else
98    {
99      enet_peer_reset (this->peer);
100      fprintf( stdout, "Connection to %s failed.", address );
101      //exit(EXIT_FAILURE);
102      return -1;
103    }
104
105    return 0;
106  }
107
108  int MasterServerComm::pollForReply( int (*callback)( char*, ENetEvent* ) )
109  { 
110    /* see whether anything happened */
111    /* WORK MARK REMOVE THIS OUTPUT */
112    COUT(2) << "polling masterserver...\n";
113
114    /* address buffer */
115    char *addrconv = NULL;
116    int retval = 0;
117
118    /* enet_host_service returns 0 if no event occured */
119    /* just newly set below test to >0 from >= 0, to be tested */
120    if( enet_host_service( this->client, this->event, 1000 ) > 0 )
121    { 
122      /* check what type of event it is and react accordingly */
123      switch (this->event->type)
124      { /* new connection, not supposed to happen. */
125        case ENET_EVENT_TYPE_CONNECT: break;
126
127        /* disconnect */
128        case ENET_EVENT_TYPE_DISCONNECT: /* ?? */ break;
129
130        /* incoming data */
131        case ENET_EVENT_TYPE_RECEIVE: 
132          addrconv = (char *) calloc( 50, 1 );
133          if( !addrconv ) 
134          { COUT(2) << "MasterServerComm.cc: Could not allocate memory!\n";
135            break;
136          }
137
138          /* resolve IP */
139          enet_address_get_host_ip( &(this->event->peer->address), 
140            addrconv, 49 );
141
142          /* DEBUG */
143          printf( "A packet of length %u containing %s was "
144            "received from %s on channel %u.\n",
145            this->event->packet->dataLength,
146            this->event->packet->data,
147            addrconv,
148            this->event->channelID );
149          /* END DEBUG */
150
151          /* call the supplied callback, if any. */
152          if( (*callback) != NULL )
153            retval = (*callback)( addrconv, (this->event) );
154
155          enet_packet_destroy( event->packet );
156          if( addrconv ) free( addrconv );
157          break;
158        default: break;
159      }
160
161      /* event handled, return 0 */
162      return retval;
163    }
164
165    /* show that no event occured */
166    return 0;
167  }
168
169  int MasterServerComm::sendRequest( char *data )
170  {
171    /* send the data to the friend */
172    /* Create a reliable packet of size 7 containing "packet\0" */
173    ENetPacket * packet = enet_packet_create( data, 
174        strlen( data ) + 1, 
175        ENET_PACKET_FLAG_RELIABLE);
176
177    /* Send the packet to the peer over channel id 0. */
178    enet_peer_send (this->peer, 0, packet);
179
180    /* One could just use enet_host_service() instead. */
181    enet_host_flush( this->client );
182   
183    /* free the packet */
184    enet_packet_destroy( packet );
185
186    /* all done. */
187    return 0;
188  }
189
190  int MasterServerComm::sendRequest( std::string data )
191  {
192    /* send the data to the friend */
193    /* Create a reliable packet of size 7 containing "packet\0" */
194    ENetPacket * packet = enet_packet_create( data.c_str(), 
195        data.length() + 1, 
196        ENET_PACKET_FLAG_RELIABLE);
197
198    /* Send the packet to the peer over channel id 0. */
199    enet_peer_send (this->peer, 0, packet);
200
201    /* One could just use enet_host_service() instead. */
202    enet_host_flush( this->client );
203    if( packet ) free( packet );
204
205    /* all done. */
206    return 0;
207  }
208
209}
210
211
212/* DON'T DELETE THIS I MIGHT NEED IT AGAIN -smerkli */
213/* not needed anymore, only here for testing purposes */
214/*
215//[> sample callback to output debugging info. <]
216//int callb( char *addr, ENetEvent *ev )
217//{
218  //printf( "A packet of length %u containing %s was "
219      //"received from %s on channel %u.\n",
220      //ev->packet->dataLength,
221      //ev->packet->data,
222      //addr,
223      //ev->channelID );
224  //return 0;
225//}
226
227//[> small testing implementation <]
228//int
229//main( int argc, char *argv[] )
230//{
231  //[> setup object and connect <]
232  //MasterServerComm msc = MasterServerComm();
233  //if( msc.connect( argv[1], 1234 ) )
234    //exit(EXIT_FAILURE);
235 
236  //[> send some data and poll for replies <]
237  //char *theinput = (char *)calloc( 100,1 );
238  //while( true )
239  //{
240    //fgets( theinput, 90, stdin );
241    //if( !strncmp( theinput, "quit", 4 ) )
242      //break;
243
244    //msc.sendRequest( theinput );
245    //msc.pollForReply( &callb );
246  //}
247
248//}
249*/
Note: See TracBrowser for help on using the repository browser.