vttelnet.cpp
上传用户:wsk323
上传日期:2007-01-05
资源大小:403k
文件大小:4k
源码类别:

Telnet服务器

开发平台:

Visual C++

  1. /*---------------------------------------------------------------------------
  2. Copyright:    E. Brady Trexler
  3. Creation:     March 1998
  4. Description:  vttelnet -- a simple command line telnet client
  5. Legal issues: Copyright (C) 1998 by E. Brady Trexler
  6.               This software is provided 'as-is', without any express or
  7.               implied warranty.  In no event will the author be held liable
  8.               for any  damages arising from the use of this software.
  9.               Permission is granted to anyone to use this software for any
  10.               purpose, excluding commercial applications, and to alter it
  11.               and redistribute it freely, subject to the following
  12.               restrictions:
  13.               1. The origin of this software must not be misrepresented,
  14.                  you must not claim that you wrote the original software.
  15.                  If you use this software in a product, an acknowledgment
  16.                  in the product documentation would be appreciated but is
  17.                  not required.
  18.               2. Altered source versions must be plainly marked as such, and
  19.                  must not be misrepresented as being the original software.
  20.               3. This notice may not be removed or altered from any source
  21.                  distribution.
  22. Updates:
  23. ---------------------------------------------------------------------------*/
  24. #include <condefs.h>
  25. #pragma hdrstop
  26. #include <conio.h>
  27. #include <stdio.h>
  28. #include <process.h>
  29. #include "VTClientSession.h"
  30. HANDLE hSaveStdin, hSaveStdout, hSaveStderr;
  31. #define BUFSIZE 4096
  32. //---------------------------------------------------------------------------
  33. USEFORM("VTClientSession.cpp", VTClient);
  34. //---------------------------------------------------------------------------
  35. void GetData(void *arg)
  36. {
  37.    DWORD dwRead;
  38.    CHAR chBuf[BUFSIZE];
  39.    while (VTClient->TnCnx->State != wsClosed){
  40.       if (!ReadFile(hSaveStdin, chBuf, BUFSIZE, &dwRead, NULL) || dwRead == 0) break;
  41.       chBuf[dwRead] = 0;
  42.       VTClient->TnCnx->Send(chBuf, dwRead);
  43.    }
  44. }
  45. #pragma argsused
  46. int main(int argc, char **argv)
  47. {
  48.    if (argc < 2){
  49.       printf("Usage: vttelnet <hostname>rn");
  50.       return 0;
  51.    }
  52.    Application->Initialize();
  53.    hSaveStdout = GetStdHandle(STD_OUTPUT_HANDLE);
  54.    hSaveStderr = GetStdHandle(STD_ERROR_HANDLE);
  55.    hSaveStdin = GetStdHandle(STD_INPUT_HANDLE);
  56.    VTClient = new TVTClient(Application);
  57.    VTClient->TnCnx->Host = argv[1];
  58. //   printf("<<<Attempting connection to %s>>>", argv[1]);
  59.    try{
  60.       VTClient->TnCnx->Connect();
  61.    }
  62.    __except (EXCEPTION_EXECUTE_HANDLER) {
  63.       printf("rn<<<Connection to %s refused>>>rn
  64. <<<or host unknown>>>rn", argv[1]);
  65.    }
  66.    VTClient->TimeOutTimer->Enabled = true;
  67. //start a thread to read input from keyboard and pass it through the socket
  68.    SECURITY_ATTRIBUTES sa =
  69.    {
  70.       sizeof(SECURITY_ATTRIBUTES),    // structure size
  71.       0,                              // No security descriptor
  72.       TRUE,                           // Thread handle is inheritable
  73.    };
  74.    DWORD   threadId;
  75.    _beginthreadNT(GetData,             // Thread starting address
  76.                   8192,                // Thread stack size
  77.                   0,                   // Thread start argument
  78.                   &sa,                 // Thread security
  79.                   0,                   // Create in running state
  80.                   &threadId);          // Thread ID.
  81.    while (VTClient->TnCnx->State != wsClosed){
  82. // these next 3 lines are crazy -- because we don't want it to terminate
  83. // but all we need is one message to be sent, which Terminate() does,
  84. // and in this context, handling that message does not close the app.
  85.       Application->Terminate();
  86.       Sleep(50);
  87.       Application->HandleMessage();
  88.    }
  89.    return 0;
  90. }