tnnet.cpp
上传用户:kunlunxyl
上传日期:2007-01-07
资源大小:45k
文件大小:6k
源码类别:

Telnet客户端

开发平台:

Visual C++

  1. ///////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Module: tnnet.cpp
  4. //
  5. // Contents: telnet network processing
  6. //
  7. // Product: telnet
  8. //
  9. // Revisions: 02.Apr.1995 igor.milavec@uni-lj.si
  10. // Original code
  11. //
  12. ///////////////////////////////////////////////////////////////////////////////
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <ansiprsr.h>
  16. #include "tnnet.h"
  17. class TTelnetParser: public TANSIParser {
  18. HANDLE hConsole;
  19. SOCKET Socket;
  20. protected:
  21. virtual int ConWriteString(char* pszString, int cbString);
  22. virtual void ConClearScreen();
  23. virtual void ConClearEOScreen();
  24. virtual void ConClearBOScreen();
  25. virtual void ConClearLine();
  26. virtual void ConClearEOLine();
  27. virtual void ConClearBOLine();
  28. virtual void ConSetCursorPosition(int x, int y);
  29. virtual void ConMoveCursorPosition(int x, int y);
  30. virtual void ConSetExtendedMode(int iFunction, BOOL bEnable);
  31. virtual int NetWriteString(char* pszString, int cbString);
  32. int ConGetCursorX();
  33. int ConGetCursorY();
  34. public:
  35. TTelnetParser(HANDLE hConsole, SOCKET Socket);
  36. };
  37. TTelnetParser::TTelnetParser(HANDLE hConsole, SOCKET Socket):
  38. hConsole(hConsole), Socket(Socket)
  39. {
  40. }
  41. int TTelnetParser::ConWriteString(char* pszString, int cbString)
  42. {
  43. DWORD Result;
  44. WriteConsole(hConsole, pszString, cbString, &Result, 0);
  45. return Result;
  46. }
  47. void TTelnetParser::ConClearScreen()
  48. {
  49. DWORD dwWritten;
  50. CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo;
  51. if (!GetConsoleScreenBufferInfo(hConsole, &ConsoleInfo))
  52. return;
  53. COORD Coord = {ConsoleInfo.srWindow.Left, ConsoleInfo.srWindow.Top};
  54. FillConsoleOutputCharacter(hConsole, ' ',
  55. (DWORD)(ConsoleInfo.srWindow.Right - ConsoleInfo.srWindow.Left)*
  56. (DWORD)(ConsoleInfo.srWindow.Bottom - ConsoleInfo.srWindow.Top),
  57. Coord, &dwWritten);
  58. }
  59. void TTelnetParser::ConClearEOScreen()
  60. {
  61. DWORD dwWritten;
  62. CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo;
  63. if (!GetConsoleScreenBufferInfo(hConsole, &ConsoleInfo))
  64. return;
  65. COORD Coord = {ConsoleInfo.srWindow.Left, (short)(ConGetCursorY() + 1)};
  66. FillConsoleOutputCharacter(hConsole, ' ',
  67. (DWORD)(ConsoleInfo.srWindow.Right - ConsoleInfo.srWindow.Left)*
  68. (DWORD)(ConsoleInfo.srWindow.Bottom - ConsoleInfo.srWindow.Top - ConGetCursorY()),
  69. Coord, &dwWritten);
  70. ConClearEOLine();
  71. }
  72. void TTelnetParser::ConClearBOScreen()
  73. {
  74. DWORD dwWritten;
  75. CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo;
  76. if (!GetConsoleScreenBufferInfo(hConsole, &ConsoleInfo))
  77. return;
  78. COORD Coord = {ConsoleInfo.srWindow.Left, ConsoleInfo.srWindow.Top};
  79. FillConsoleOutputCharacter(hConsole, ' ',
  80. (DWORD)(ConsoleInfo.srWindow.Right - ConsoleInfo.srWindow.Left)*
  81. (DWORD)(ConsoleInfo.srWindow.Bottom - ConsoleInfo.srWindow.Top - ConGetCursorY() - 1),
  82. Coord, &dwWritten);
  83. ConClearBOLine();
  84. }
  85. void TTelnetParser::ConClearLine()
  86. {
  87. DWORD dwWritten;
  88. CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo;
  89. if (!GetConsoleScreenBufferInfo(hConsole, &ConsoleInfo))
  90. return;
  91. COORD Coord = {
  92. ConsoleInfo.srWindow.Left,
  93. (short)(ConsoleInfo.srWindow.Top + ConGetCursorY())};
  94. FillConsoleOutputCharacter(hConsole, ' ',
  95. (DWORD)(ConsoleInfo.srWindow.Right - ConsoleInfo.srWindow.Left),
  96. Coord, &dwWritten);
  97. }
  98. void TTelnetParser::ConClearEOLine()
  99. {
  100. DWORD dwWritten;
  101. CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo;
  102. if (!GetConsoleScreenBufferInfo(hConsole, &ConsoleInfo))
  103. return;
  104. COORD Coord = {
  105. (short)(ConsoleInfo.srWindow.Left + ConGetCursorX()),
  106. (short)(ConsoleInfo.srWindow.Top + ConGetCursorY())};
  107. FillConsoleOutputCharacter(hConsole, ' ',
  108. (DWORD)(ConsoleInfo.srWindow.Right - ConGetCursorX()),
  109. Coord, &dwWritten);
  110. }
  111. void TTelnetParser::ConClearBOLine()
  112. {
  113. DWORD dwWritten;
  114. CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo;
  115. if (!GetConsoleScreenBufferInfo(hConsole, &ConsoleInfo))
  116. return;
  117. COORD Coord = {
  118. ConsoleInfo.srWindow.Left,
  119. (short)(ConsoleInfo.srWindow.Top + ConGetCursorY())};
  120. FillConsoleOutputCharacter(hConsole, ' ',
  121. (DWORD)(ConGetCursorX()),
  122. Coord, &dwWritten);
  123. }
  124. void TTelnetParser::ConSetCursorPosition(int x, int y)
  125. {
  126. CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo;
  127. if (!GetConsoleScreenBufferInfo(hConsole, &ConsoleInfo))
  128. return;
  129. COORD Coord = {
  130. (short)(ConsoleInfo.srWindow.Left + x),
  131. (short)(ConsoleInfo.srWindow.Top + y)};
  132. SetConsoleCursorPosition(hConsole, Coord);
  133. }
  134. int TTelnetParser::ConGetCursorX()
  135. {
  136. CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo;
  137. if (!GetConsoleScreenBufferInfo(hConsole, &ConsoleInfo))
  138. return 0;
  139. return ConsoleInfo.dwCursorPosition.X - ConsoleInfo.srWindow.Left;
  140. }
  141. int TTelnetParser::ConGetCursorY()
  142. {
  143. CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo;
  144. if (!GetConsoleScreenBufferInfo(hConsole, &ConsoleInfo))
  145. return 0;
  146. return ConsoleInfo.dwCursorPosition.Y - ConsoleInfo.srWindow.Top;
  147. }
  148. void TTelnetParser::ConMoveCursorPosition(int x, int y)
  149. {
  150. CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo;
  151. if (!GetConsoleScreenBufferInfo(hConsole, &ConsoleInfo))
  152. return;
  153. COORD Coord = {
  154. (short)(ConsoleInfo.dwCursorPosition.X + x),
  155. (short)(ConsoleInfo.dwCursorPosition.Y + y)};
  156. SetConsoleCursorPosition(hConsole, Coord);
  157. }
  158. void TTelnetParser::ConSetExtendedMode(int iFunction, BOOL bEnable)
  159. {
  160. // Probably should do something here...
  161. }
  162. int TTelnetParser::NetWriteString(char* pszString, int cbString)
  163. {
  164. send(Socket, pszString, cbString, 0);
  165. return cbString;
  166. }
  167. DWORD telProcessNetwork(LPVOID pvParams)
  168. {
  169. TelThreadParams* pParams = (TelThreadParams*)pvParams;
  170. SOCKET Socket = pParams->Socket;
  171. TTelnetParser Parser(GetStdHandle(STD_OUTPUT_HANDLE), Socket);
  172. const DWORD dwBuffer = 1024;
  173. char szBuffer[dwBuffer];
  174. char* pszHead = szBuffer;
  175. char* pszTail = szBuffer;
  176. while (1) {
  177. int Result = recv(Socket, pszTail, (szBuffer + dwBuffer) - pszTail, 0);
  178. if ((Result <= 0) || ( Result > dwBuffer))
  179. break;
  180. pszTail += Result;
  181. char* pszNewHead = pszHead;
  182. do {
  183. pszHead = pszNewHead;
  184. pszNewHead = Parser.ParseBuffer(pszHead, pszTail);
  185. } while ((pszNewHead != pszHead) && (pszNewHead < pszTail));
  186. pszHead = pszNewHead;
  187. // When we reach the end of the buffer, move contents to the
  188. // beginning of the buffer to get free space at the end.
  189. if (pszTail == (szBuffer + dwBuffer)) {
  190. MoveMemory(szBuffer, pszHead, pszTail - pszHead);
  191. pszTail = szBuffer + (pszTail - pszHead);
  192. pszHead = szBuffer;
  193. }
  194. }
  195. printf("nConnection terminated by remote.n");
  196. SetEvent(pParams->hExit);
  197. return 0;
  198. }