// 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