// Xb2.NET sample showing how to create a simple Telnet client
    //------------------------------------------------------------------------------------
    
    #include "xb2net.ch"
    #include "common.ch"
    #include "xbp.ch"
    #include "inkey.ch"
    
    #pragma  library ("xb2net.lib")
    
    #define CRLF            (Chr(13)+Chr(10))
    #xtranslate NTrim()   =>  LTrim(Str())
    
    
    procedure Main( cHost, cPort )
       Local nKey, cSend, cRecv, oSock, cColor
    
       DEFAULT cHost TO "LocalHost"  // a server running on the same machine
       DEFAULT cPort TO "23"         // default port for Telnet
    
       SET CURSOR ON
    
       ? "open socket..."
    
       oSock := xbSocket():New(AF_INET, SOCK_STREAM, IPPROTO_IP)
    
       if oSock:ErrorCode > 0
          MsgBox("Unable to create a socket!" + chr(10) +;
                 "Error code: " + LTrim(Str(oSock:ErrorCode)) + " (" + oSock:ErrorText(oSock:ErrorCode) + ")" )
          Return
       endif
    
       ? "connect to server..."
    
       if ! oSock:Connect(cHost, Val(cPort))
          MsgBox("Unable to connect to: " + cHost + chr(10) +;
                 "Error code: " + LTrim(Str(oSock:ErrorCode)) + " (" + oSock:ErrorText(oSock:ErrorCode) + ")" )
          oSock:destroy()
          Return
       endif
    
       // turn off blocking mode so that :Send/:Recv don't wait
       oSock:SetBlockingMode(.f.)
    
       ? "connected to: ", oSock:RemoteName, ", address:", oSock:InetNtoA(oSock:RemoteAddr), ", port:", NTrim(oSock:RemotePort)
       ?
    
       nKey := 1
    
       while nKey != K_ESC
    
          if nKey != 0
             if oSock:Send( cSend ) < 0
                ? "connection lost..."
                exit
             endif
          endif
    
          cRecv := oSock:Recv()
    
          do case
          case cRecv == NIL
             ? "connection lost..."
             exit
    
          case Empty(cRecv)
             nKey := inkey(0.1)
             if nKey > 0
                cSend := iif(nKey == K_ENTER, CRLF, chr(nKey))
                ?? cSend
             endif
    
          otherwise
             SET CURSOR OFF
             nKey   := 0
             cColor := SetColor("w/b")
             ? cRecv
             SetColor(cColor)
             ?
             SET CURSOR ON
    
          endcase
    
       end
    
       // don't forget to destroy the object !!
       oSock:destroy()
       wait
    
       Return
    

    home     download     top of page