home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic 5 Developer's Kit / vb5 dev kit.iso / dev / tcp4w20 / samples / pascal / pwtn.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-06-10  |  5.1 KB  |  196 lines

  1. Program PWTN;
  2. {$A+,B-,D+,F-,G+,I-,K+,L+,N-,P+,Q+,R+,S+,T+,V+,W+,X+,Y+}
  3. {$M 8192,8192}
  4. {Simple Telnet Client for TCP4W}
  5.  
  6. Uses WinTypes, WinProcs, WinCrt, Strings, UseTcp4w;
  7.  
  8. Const LTIL = $7000;
  9.  
  10. Type PLongTextItem = ^TLongTextItem;
  11.      TLongTextItem = Array [0..LTIL] Of Char;
  12.  
  13. Var Status: Integer;
  14.     LineMode: Boolean;
  15.     S: TSocket;
  16.     Port: Integer;
  17.     T, U: PLongTextItem;
  18.     Ch: Char;
  19.     SaveExitProc : Pointer;
  20.     IP: TIP;
  21.  
  22. Procedure WriteWinsockVerInfo;
  23.   Const WSADESCRIPTION_LEN = 256;
  24.         WSASYS_STATUS_LEN = 128;
  25.   Type TWSAData = Record
  26.            wVersion: Word;
  27.            wHighVersion: Word;
  28.            szDescription: Array [0..WSADESCRIPTION_LEN] Of Char;
  29.            szSystemStatus: Array [0..WSASYS_STATUS_LEN] Of Char;
  30.            iMaxSockets: Byte;
  31.            iMaxUdpDg: Byte;
  32.            lpVendorInfo: Pointer;
  33.          End;
  34.        TWSAStartUp = Function (wVersionRequested: Word; WSAData: TWSAData): Integer;
  35.        TWSACleanup = Function: Integer;
  36.   Var WSAData: TWSAData;
  37.       hWinsock: THandle;
  38.       FP : TFarProc;
  39.   Begin
  40.     hWinsock := LoadLibrary ('WINSOCK');
  41.     If hWinsock >= 32 Then
  42.       Begin
  43.         FP := GetProcAddress (hWinsock, 'WSAStartup');
  44.         If FP <> NIL Then
  45.           If TWSAStartUp (FP) (257, WSAData) = 0 Then
  46.             WriteLn (WSAData.szDescription);
  47.         FP := GetProcAddress (hWinsock, 'WSACleanup');
  48.         If FP <> NIL Then TWSACleanUp (FP);
  49.         FreeLibrary (hWinsock)
  50.       End
  51.   End;
  52.  
  53. Procedure CheckStatus;
  54.   Begin
  55.     If Status > 0 Then Exit;
  56.     WriteLn;
  57.     WriteLn ('?', Tcp4W_Error (Status));
  58.     Halt
  59.   End;
  60.  
  61. Procedure MyExitProc; Far;
  62.   Begin
  63.     ExitProc := SaveExitProc;
  64.     If S <> 0 Then TcpClose (S);
  65.     Tcp4WCleanup;
  66.   End;
  67.  
  68. Procedure CharModeLoop;
  69.   Begin
  70.     Repeat
  71.       If KeyPressed Then
  72.         Begin
  73.           Ch := ReadKey;
  74.           Status := TcpSend (S, @Ch, 1, False, -1);
  75.           CheckStatus;
  76.         End;
  77.       If TcpIsDataAvail (S) <> 0 Then
  78.         Begin
  79.           Status := TcpRecv (S, T^, LTIL, 1, -1);
  80.           CheckStatus;
  81.           T^[Status] := #0;
  82.           If T^[0] = #255 Then
  83.             Begin
  84.               If T^[1] = #253 Then
  85.                 Begin
  86.                   StrCopy (T^, #255#252#24);
  87.                   Status := TcpSend (S, T^, 3, False, -1);
  88.                   CheckStatus;
  89.                 End
  90.                 Else If StrScan (T^, #13) <> NIL Then
  91.                        Write (StrScan (T^, #13))
  92.             End
  93.             Else Write (T^);
  94.         End;
  95.     Until Ch = #3;
  96.   End;
  97.  
  98. Procedure LineModeLoop;
  99.   Begin
  100.     CheckBreak := True;
  101.     WriteLn ('Perhaps you must press enter now');
  102.     Status := TcpRecv (S, T^, LTIL, 10, -1);
  103.     CheckStatus;
  104.     T^[Status] := #0;
  105.     If T^[0] = #255 Then
  106.       Begin
  107.         StrCopy (T^, #255#252#24);
  108.         Status := TcpSend (S, T^, 3, False, -1);
  109.         CheckStatus;
  110.         Status := TCPRecv (S, T^, LTIL, 10, -1);
  111.       End
  112.       Else Write (T^);
  113.     Repeat
  114.       While (TcpIsDataAvail (S) <> 0 ) Do
  115.         Begin
  116.           Status := TcpRecv (S, T^, LTIL, 1, -1);
  117.           CheckStatus;
  118.           T^[Status] := #0;
  119.           Write (T^)
  120.         End;
  121.      ReadLn (U^);
  122.      StrCat (U^, #13#10);
  123.       While (TcpIsDataAvail (S) <> 0 ) Do
  124.         Begin
  125.           Status := TcpRecv (S, T^, LTIL, 1, -1);
  126.           CheckStatus;
  127.           T^[Status] := #0;
  128.           Write (T^)
  129.         End;
  130.       Status := TcpSend (S, U^, StrLen (U^) , False, -1);
  131.       CheckStatus;
  132.       Repeat Until (TcpIsDataAvail (S) <> 0);
  133.       Status := TcpRecv (S, T^, LTIL, 10, -1);
  134.       CheckStatus;
  135.       T^[Status] := #0;
  136.       Write (T^);
  137.     Until False;
  138.   End;
  139.  
  140. Begin
  141.   CheckBreak := False;
  142.   CmdShow := sw_ShowMaximized;
  143.   AutoTracking := False;
  144.   New (T);
  145.   New (U);
  146.   WriteLn ('Simple Telnet Client by AStA (Andreas.Tikart@uni-konstanz.de) <Polarwolf>');
  147.   Tcp4wVer (T^, 0);
  148.   WriteLn (T^);
  149.   WriteWinsockVerInfo;
  150.   WriteLn;
  151.   S := 0;
  152.   Port := 23;
  153.   SaveExitProc := ExitProc;
  154.   ExitProc := @MyExitProc;
  155.   Status := Tcp4wInit;
  156.   CheckStatus;
  157.  
  158.   Write ('Host (Default:polydos.uni-konstanz.de):');
  159.   ReadLn (T^);
  160.   If StrLen (T^) = 0 Then
  161.     Begin
  162.       StrCopy (T^,'polydos.uni-konstanz.de');
  163.       Port := 775;
  164.       LineMode := True;
  165.     End
  166.     Else Begin
  167.       Write ('Enter "c" for Char-Mode, "l" for Line-Mode:');
  168.       Repeat
  169.         Ch := ReadKey;
  170.       Until Ch In ['c', 'C', 'l', 'L'];
  171.       If LineMode Then WriteLn ('Line-Mode') Else Write ('CharMode');
  172.       LineMode := Ch In ['l', 'L'];
  173.     End;
  174.   Status := TcpConnect (S, T^, '', Port);
  175.   CheckStatus;
  176.   WriteLn ('Socket: ', S, '  Port: ', Port);
  177.   Status := TcpGetLocalID (T^, LTIL, IP);
  178.   CheckStatus;
  179.   WriteLn ('Local  Host: ', T^, ' (', IP.B1, '.', IP.B2, '.',
  180.     IP.B3, '.', IP.B4, ')');
  181.   Status := TcpGetRemoteID (S, T^, LTIL, IP);
  182.   CheckStatus;
  183.   WriteLn ('Remote Host: ', T^, ' (', IP.B1, '.', IP.B2, '.',
  184.     IP.B3, '.', IP.B4, ')');
  185.   WriteLn;
  186.  
  187.   Ch := #0;
  188.   If LineMode Then LineModeLoop Else CharModeLoop;
  189.   TcpClose (S);
  190.   S := 0;
  191.   CheckStatus;
  192.   Tcp4WCleanUp;
  193.   ExitProc := SaveExitProc;
  194.   DoneWinCrt;
  195. End.
  196.