vncSockConnect.cpp
上传用户:sbftbdw
上传日期:2007-01-03
资源大小:379k
文件大小:4k
源码类别:

远程控制编程

开发平台:

Visual C++

  1. //  Copyright (C) 1997, 1998 Olivetti & Oracle Research Laboratory
  2. //
  3. //  This file is part of the VNC system.
  4. //
  5. //  The VNC system is free software; you can redistribute it and/or modify
  6. //  it under the terms of the GNU General Public License as published by
  7. //  the Free Software Foundation; either version 2 of the License, or
  8. //  (at your option) any later version.
  9. //
  10. //  This program is distributed in the hope that it will be useful,
  11. //  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. //  GNU General Public License for more details.
  14. //
  15. //  You should have received a copy of the GNU General Public License
  16. //  along with this program; if not, write to the Free Software
  17. //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
  18. //  USA.
  19. //
  20. // If the source code for the VNC system is not available from the place 
  21. // whence you received this file, check http://www.orl.co.uk/vnc or contact
  22. // the authors on vnc@orl.co.uk for information on obtaining it.
  23. // vncSockConnect.cpp
  24. // Implementation of the listening socket class
  25. #include "stdhdrs.h"
  26. #include "VSocket.h"
  27. #include "vncSockConnect.h"
  28. #include "vncServer.h"
  29. #include <omnithread.h>
  30. // The function for the spawned thread to run
  31. class vncSockConnectThread : public omni_thread
  32. {
  33. public:
  34. // Init routine
  35. virtual BOOL Init(VSocket *socket, vncServer *server);
  36. // Code to be executed by the thread
  37. virtual void *run_undetached(void * arg);
  38. // Fields used internally
  39. BOOL m_shutdown;
  40. protected:
  41. VSocket *m_socket;
  42. vncServer *m_server;
  43. };
  44. // Method implementations
  45. BOOL vncSockConnectThread::Init(VSocket *socket, vncServer *server)
  46. {
  47. // Save the server pointer
  48. m_server = server;
  49. // Save the socket pointer
  50. m_socket = socket;
  51. // Start the thread
  52. m_shutdown = FALSE;
  53. start_undetached();
  54. return TRUE;
  55. }
  56. // Code to be executed by the thread
  57. void *vncSockConnectThread::run_undetached(void * arg)
  58. {
  59. log.Print(LL_STATE, VNCLOG("started socket connection threadn"));
  60. // Go into a loop, listening for connections on the given socket
  61. while (!m_shutdown)
  62. {
  63. // Accept an incoming connection
  64. VSocket *new_socket = m_socket->Accept();
  65. if (new_socket == NULL)
  66. break;
  67. log.Print(LL_CLIENTS, VNCLOG("accepted connection from %sn"), new_socket->GetPeerName());
  68. // Successful accept - start the client unauthenticated
  69. m_server->AddClient(new_socket, FALSE);
  70. }
  71. log.Print(LL_STATE, VNCLOG("quitting socket connection threadn"));
  72. return NULL;
  73. }
  74. // The vncSockConnect class implementation
  75. vncSockConnect::vncSockConnect()
  76. {
  77. m_thread = NULL;
  78. }
  79. vncSockConnect::~vncSockConnect()
  80. {
  81.     m_socket.Shutdown();
  82.     // Join with our lovely thread
  83.     if (m_thread != NULL)
  84.     {
  85. // *** This is a hack to force the listen thread out of the accept call,
  86. // because Winsock accept semantics are broken
  87. ((vncSockConnectThread *)m_thread)->m_shutdown = TRUE;
  88. VSocket socket;
  89. socket.Create();
  90. socket.Bind(0);
  91. socket.Connect("localhost", m_port);
  92. socket.Close();
  93. void *returnval;
  94. m_thread->join(&returnval);
  95. m_thread = NULL;
  96. m_socket.Close();
  97.     }
  98. }
  99. BOOL vncSockConnect::Init(vncServer *server, UINT port)
  100. {
  101. // Save the port id
  102. m_port = port;
  103. // Create the listening socket
  104. if (!m_socket.Create())
  105. return FALSE;
  106. // Bind it
  107. if (!m_socket.Bind(m_port))
  108. return FALSE;
  109. // Set it to listen
  110. if (!m_socket.Listen())
  111. return FALSE;
  112. // Create the new thread
  113. m_thread = new vncSockConnectThread;
  114. if (m_thread == NULL)
  115. return FALSE;
  116. // And start it running
  117. return ((vncSockConnectThread *)m_thread)->Init(&m_socket, server);
  118. }