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

模拟服务器

开发平台:

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. #include "RedirectorSrv.h"
  17. #include "Network.h"
  18. #include "Log.h"
  19. #include "Sockets.h"
  20. void RedirectorSrv::client_sockevent(struct nlink_client *cptr, unsigned short revents){
  21. }
  22. void RedirectorSrv::Initialise( int port, char *type, char * destination ) {
  23.     assert( this != 0 );
  24.     mDestination = destination;
  25.     Server::Initialise( port, type );
  26. }
  27. void RedirectorSrv::server_sockevent( nlink_server *cptr, uint16 revents, void *myNet ) {
  28. NetworkInterface * client;
  29. struct nlink_client *ncptr;
  30. if(revents & PF_READ)
  31. {
  32. client = ( ( NetworkInterface * ) myNet )->getConnection( );
  33. if (!client) 
  34. return;
  35. uint32 nonblockingstate = true;
  36. IOCTL_SOCKET( client->getSocketID(), IOCTL_NOBLOCK, &nonblockingstate );
  37. ncptr = new nlink_client;
  38. if(ncptr == NULL)
  39. return;
  40. memset(ncptr, 0, sizeof(*ncptr));
  41. ncptr->hdr.type = RCLIENT;
  42. ncptr->hdr.fd = client->getSocketID();
  43. nlink_insert((struct nlink *)ncptr);
  44. Client *pClient = new Client();
  45. pClient->BindNI(client);
  46. ncptr->pClient = pClient;
  47. pClient->getNetwork()->sendData( mDestination.length( ), mDestination.c_str( ) );
  48. Log::getSingleton( ).outString( "REDIRECTOR: Sent world server" );
  49. disconnect_client( ncptr );
  50. }
  51. }
  52. void RedirectorSrv::disconnect_client( struct nlink_client *cptr )
  53. {
  54. Client * pClient = static_cast < Client * > ( cptr->pClient );
  55. mClients.erase( pClient );
  56. delete pClient;
  57. Log::getSingleton( ).outString( "REDIRECTOR: Socket Closed!" );
  58. Server::disconnect_client( cptr );
  59. }