telnetthread.cpp
上传用户:zhangwei01
上传日期:2007-01-09
资源大小:25k
文件大小:4k
源码类别:

Telnet服务器

开发平台:

Visual C++

  1. ///////////////////////////////////////////////////////////////////////
  2. // Filename: telnetthread.cpp
  3. //
  4. // Date    : 27-May-2001
  5. // Author  : J.Hogendoorn ( jeroenhog@gmx.net )
  6. //
  7. // Note    : this code may be used anywhere as long
  8. //         : as this comment remains. 
  9. //
  10. ///////////////////////////////////////////////////////////////////////
  11. #include "stdafx.h"
  12. #include "telnet.h"
  13. //////////////////////////////////////////////////////////////////////
  14. // Function: TelnetThread
  15. // In      : pointer to CTelnet instance
  16. // Out     : none
  17. // Purpose : uses CTelnet and CTelnetSocket to implement a telnet service
  18. // Note    : runs as a seperate thread
  19. void TelnetThread(void* telnet)
  20. {
  21. // get pointer to telnet class
  22. CTelnet* tel = (CTelnet*)telnet;
  23. // if initialize fails, we'd better stop
  24. if ( !tel->getTelnetSocket()->initialize( tel->getPortNumber() ) )
  25. {
  26. tel->setLastError( "starting telnet server failed: " + tel->getTelnetSocket()->getLastError() );
  27. // signal event ( makes main thread run )
  28. SetEvent( tel->getThreadStartupFailedEvent() );
  29. return;
  30. }
  31. // signal event ( makes main thread run )
  32. SetEvent( tel->getThreadStartupSucceededEvent() );
  33. // loop forever
  34. while(1)
  35. {
  36. // we are not logged on yet
  37. tel->setNotLoggedOn();
  38. if ( !tel->getTelnetSocket()->waitForConnection() )
  39. {
  40. continue;
  41. }
  42. ////////////////////////////////////////////////////////////////////////////////
  43. // login sequence 
  44. ////////////////////////////////////////////////////////////////////////////////
  45. // we got a connection now, send the intro screen
  46. if ( !tel->getTelnetSocket()->sendData( tel->getIntroScreen() ) )
  47. {
  48. tel->getTelnetSocket()->closeClientSocket();
  49. continue;
  50. }
  51. CString sUserId;
  52. if ( tel->getUserId().GetLength() != 0 )
  53. {
  54. // ask for userid (send)
  55. if ( !tel->getTelnetSocket()->sendData( tel->getUserIdPrompt() ) )
  56. {
  57. tel->getTelnetSocket()->closeClientSocket();
  58. continue;
  59. }
  60. // ask for userid (receive)
  61. if ( !tel->getTelnetSocket()->waitForData( sUserId ) )
  62. {
  63. tel->getTelnetSocket()->closeClientSocket();
  64. continue;
  65. }
  66. }
  67. CString sPasswd;
  68. if ( tel->getPassword().GetLength() != 0 )
  69. {
  70. // ask for password (send)
  71. if ( !tel->getTelnetSocket()->sendData( tel->getPasswordPrompt() ) )
  72. {
  73. tel->getTelnetSocket()->closeClientSocket();
  74. continue;
  75. }
  76. // ask for password (receive)
  77. if ( !tel->getTelnetSocket()->waitForData( sPasswd , true ) )
  78. {
  79. tel->getTelnetSocket()->closeClientSocket();
  80. continue;
  81. }
  82. }
  83. // check for correct password or userid
  84. if ( tel->getUserId().GetLength() != 0 )
  85. {
  86. if ( tel->getUserId() != sUserId )
  87. {
  88. // make brute force attack more difficult
  89. Sleep(5000);
  90. tel->getTelnetSocket()->closeClientSocket();
  91. continue;
  92. }
  93. }
  94. if ( tel->getPassword().GetLength() != 0 )
  95. {
  96. if ( tel->getPassword() != sPasswd )
  97. {
  98. // make brute force attack more difficult
  99. Sleep(5000);
  100. tel->getTelnetSocket()->closeClientSocket();
  101. continue;
  102. }
  103. }
  104. // logged on now
  105. tel->setLoggedOn();
  106. ///////////////////////////////////////////////////////////////////////////
  107. // handle commands
  108. ///////////////////////////////////////////////////////////////////////////
  109. while(1)
  110. {
  111. // send the prompt
  112. if ( !tel->getTelnetSocket()->sendData( tel->getPrompt() ) )
  113. {
  114. tel->getTelnetSocket()->closeClientSocket();
  115. continue;
  116. }
  117. // handle commands
  118. CString sCommand;
  119. if ( !tel->getTelnetSocket()->waitForData( sCommand ) )
  120. {
  121. tel->getTelnetSocket()->closeClientSocket();
  122. continue;
  123. }
  124. CString sArgs;
  125. callback fun = tel->matchFunction( sCommand , sArgs );
  126. if ( fun != NULL )
  127. {
  128. CString sDataBack = fun( sArgs );
  129. if ( !tel->getTelnetSocket()->sendData( sDataBack ) )
  130. {
  131. tel->getTelnetSocket()->closeClientSocket();
  132. continue;
  133. }
  134. }
  135. }
  136. }
  137. };