"SfR Fresh" - the SfR Freeware/Shareware Archive

Member "usr/xb-6.2.3/demo/aclient.x" of archive xbasic-6.2.3-linux-i386.tar.gz:


'
' ####################
' #####  PROLOG  #####
' ####################
'
PROGRAM	"aclient"
VERSION	"0.0001"
'
IMPORT	"xst"
IMPORT  "xin"
IMPORT	"xui"
'
' IMPORTANT : The Windows XBasic "xin" sockets/network/internet
' function library is disabled if file "c:/windows/xb.ini" exits
' and contains the line "xin=false".  The best way to enable the
' "xin" function library is to comment-out that line with a '
' comment-character prefix - change "xin=false" to "' xin=false".
' You can then re-disable the "xin" library if you wish by simply
' removing the ' comment character.  Why is this silly "xin=false"
' initialization-string needed?  For unknown reasons, in computers
' that do not have TCP/IP networking but DO have dial-up networking,
' initialization in "xin" malfunctions unless a dial-up connection
' has been made since the computer started.  Why is unclear, and
' hopefully this silly workaround can be eliminated someday.
'
' This "aclient.x" program is a client to the "aserver.x" server
' program to test and demonstrate the simplest possible client
' and server programs.  The "aserver.x" server program is on
' port 0x2020 and all it does is send a time stamp string when
' it receives a "time" request from a client.
'
' You will need to change the $$SERVER_ADDRESS constant below to
' the IP address of the system running the "aserver.x" program.
' If you do not know the "dot notation" IP address of the system
' running "aserver.x", enter "ping systemname" at the command
' prompt on that system to make it print.
'
'
DECLARE FUNCTION  Entry      ( )
DECLARE FUNCTION  Blowback   ( )
'
' remember, you need to change $$SERVER_ADDRESS below
'
	$$SERVER_PORT    = 0x2020				' port # of "aserver.x"
	$$SERVER_ADDRESS = "76.7.4.3"		' IP address of "aserver.x"
'
'
' ######################
' #####  Entry ()  #####
' ######################
'
FUNCTION  Entry ()
	HOST  host
'
	XinSetDebug (1)							' print info
	socket = $$FALSE						' no server socket yet
	connected = $$FALSE					' not connected to server yet
	buffer$ = NULL$ (255)				' place to capture timestamp string
'
	GOSUB ClearConsole					' clear console for readability
	GOSUB PrintBanner						' print aclient.x startup banner
	GOSUB Initialize						' initialize network function library
	GOSUB PrintLocalHostInfo		' print information about this system
	GOSUB PrintNetworkAddress		' print network address of this system
	GOSUB OpenSocket						' open a network communications socket
	GOSUB BindSocket						' bind the socket to a local port
	GOSUB ConnectRequest				' request connection to server
'
	DO UNTIL connected
		GOSUB ConnectStatus				' wait for connection to server
	LOOP
'
	GOSUB GetAddresses					' get client/server address and port
'
	FOR i = 0 TO 3							' request 4 timestamp strings
		GOSUB WriteTimeRequest		' write "time" to timestamp server
		IFZ socket THEN EXIT FOR	' were we rudely disconnected ???
		GOSUB ReadTimeStamp				' read reply timestamp string
		IFZ socket THEN EXIT FOR	' were we rudely disconnected ???
	NEXT i											'
'
	Blowback ()
	RETURN
'
'
' *****  ClearConsole  *****
'
SUB ClearConsole
	XstGetConsoleGrid (@console)
	XuiSendStringMessage (console, @"SetTextArray", 0, 0, 0, 0, 0, 0)
	XuiSendStringMessage (console, @"Redraw", 0, 0, 0, 0, 0, 0)
END SUB
'
' *****  PrintBanner  *****
'
SUB PrintBanner
	PRINT
	PRINT "####################################################"
	PRINT "#####  XBasic Network Functions Test : Client  #####"
	PRINT "####################################################"
END SUB
'
'
' *****  Initialize  *****
'
SUB Initialize
	PRINT
	PRINT "#####  Xin ()  #####"
	PRINT "#####  XinInitialize (@local, @hosts, @sockets, @version, @comments$, @notes$)  #####"
'
	Xin ()
	XinInitialize (@local, @hosts, @version, @sockets, @comments$, @notes$)
'
' *****  print basic network information  *****
'
	PRINT
	PRINT "local                  = "; HEX$ (local,8)
	PRINT "hosts                  = "; HEX$ (hosts,8)
	PRINT "sockets                = "; HEX$ (sockets,8)
	PRINT "version                = "; HEX$ (version,8)
	PRINT "comments$              = "; comments$
	PRINT "notes$                 = "; notes$
END SUB
'
'
' *****  PrintLocalHostInfo  *****
'
SUB PrintLocalHostInfo
	PRINT
	PRINT "#####  XinHostNumberToInfo (base, @info)  #####"
'
	XinHostNumberToInfo (0, @host)
	hostaddress = host.address
	address$$ = host.address
	host$ = host.name
'
	PRINT
	PRINT "host.name              = \""; host.name; "\""
	PRINT "host.alias[0]          = \""; host.alias[0]; "\""
	PRINT "host.alias[1]          = \""; host.alias[1]; "\""
	PRINT "host.alias[2]          = \""; host.alias[2]; "\""
	PRINT "host.system            = \""; host.system; "\""
	PRINT "host.hostnumber        = "; HEX$ (host.hostnumber,8)
	PRINT "host.address           = "; HEX$ (host.address,8); " = "; STRING$(host.address AND 0x000000FF) + "." + STRING$((host.address >> 8) AND 0x000000FF) + "." + STRING$((host.address >> 16) AND 0x000000FF) + "." + STRING$((host.address >> 24) AND 0x000000FF)
'
	FOR i = 0 TO 7
		PRINT "host.addresses[" + STRING$(i) + "]      = "; HEX$ (host.addresses[i],8); " = "; STRING$(host.addresses[i] AND 0x000000FF) + "." + STRING$((host.addresses[i] >> 8) AND 0x000000FF) + "." + STRING$((host.addresses[i] >> 16) AND 0x000000FF) + "." + STRING$((host.addresses[i] >> 24) AND 0x000000FF)
	NEXT i
'
	PRINT "host.addressBytes      = "; HEX$ (host.addressBytes,8)
	PRINT "host.addressFamily     = "; HEX$ (host.addressFamily,8)
	PRINT "host.protocolFamily    = "; HEX$ (host.protocolFamily,8)
	PRINT "host.protocol          = "; HEX$ (host.protocol,8)
END SUB
'
'
' *****  PrintNetworkAddress  *****
'
SUB PrintNetworkAddress
	PRINT
	XinAddressNumberToString (@address$$, @address$)
	PRINT "<"; HEX$(address$$,16); "> <"; address$; "> <";
	XinAddressStringToNumber (@address$, @addr$$)
	PRINT address$; "> <"; HEX$(addr$$,16); ">"
END SUB
'
'
' *****  OpenSocket  *****
'
SUB OpenSocket
	PRINT
	PRINT "#####  error = XinSocketOpen (@socket, addressType, socketType, flags)  #####"
'
	flags = 0
	socketType = 0
	addressType = 0
	error = XinSocketOpen (@socket, @addressType, @socketType, flags)
'
	PRINT
	PRINT "error                  = "; HEX$ (error, 8)
	PRINT "socket                 = "; HEX$ (socket, 8)
	PRINT "addressType            = "; HEX$ (addressType, 8)
	PRINT "socketType             = "; HEX$ (socketType, 8)
	PRINT "flags                  = "; HEX$ (flags, 8)
'
	IF error THEN
		Blowback ()
		RETURN
	END IF
END SUB
'
'
' *****  BindSocket  *****
'
SUB BindSocket
	PRINT
	PRINT "#####  error = XinSocketBind (socket, block, @address$$, @port)  #####"
'
	port = 0
	address = 0
	error = XinSocketBind (socket, block, @address$$, @port)
'
	PRINT
	PRINT "error                  = "; HEX$ (error, 8)
	PRINT "socket                 = "; HEX$ (socket, 8)
	PRINT "address                = "; HEX$ (address, 8)
	PRINT "port                   = "; HEX$ (port, 8)
'
	IF error THEN
		Blowback ()
		RETURN
	END IF
END SUB
'
'
' *****  ConnectRequest  *****
'
SUB ConnectRequest
	XinAddressStringToNumber (@$$SERVER_ADDRESS, @serveraddress$$)
	serverport = $$SERVER_PORT
	block = 0
'
	PRINT
	PRINT "#####  error = XinSocketConnectRequest (socket, block, serveraddress$$, serverport)  #####"

	error = XinSocketConnectRequest (socket, block, serveraddress$$, serverport)
'
	PRINT
	PRINT "error                  = "; HEX$ (error, 8)
	PRINT "socket                 = "; HEX$ (socket, 8)
	PRINT "block                  = "; HEX$ (block, 8)
	PRINT "serveraddress$$        = "; HEX$ (serveraddress$$, 16)
	PRINT "serverport             = "; HEX$ (serverport, 8)
'
	IF error THEN
		Blowback ()
		RETURN
	END IF
END SUB
'
'
' *****  ConnectStatus  ******
'
SUB ConnectStatus
	error = 0
	block = 100
	error = XinSocketConnectStatus (socket, block, @connected)
'
	IF (error OR connected) THEN
		PRINT
		PRINT "#####  error = XinSocketConnectStatus (socket, block, @connected)  #####"
'
		PRINT
		PRINT "error                  = "; HEX$ (error, 8)
		PRINT "socket                 = "; HEX$ (socket, 8)
		PRINT "block                  = "; HEX$ (block, 8)
		PRINT "connected              = "; HEX$ (connected, 8)
	END IF
'
	IF error THEN
		Blowback ()
		RETURN
	END IF
END SUB
'
'
' *****  GetAddresses  *****
'
SUB GetAddresses
	PRINT
	PRINT "#####  error = XinSocketGetAddress (socket, @port, @address$$, @remote, @rport, @raddress$$)  #####"
'
	error = XinSocketGetAddress (socket, @port, @address$$, @remote, @rport, @raddress$$)
'
	PRINT
	PRINT "error                  = "; HEX$ (error, 8)
	PRINT "port                   = "; HEX$ (port, 8)
	PRINT "address$$              = "; HEX$ (address$$, 16)
	PRINT "rport                  = "; HEX$ (rport, 8)
	PRINT "raddress$$             = "; HEX$ (raddress$$, 16)
END SUB
'
'
' *****  WriteTimeRequest  *****
'
SUB WriteTimeRequest
	sent = 0
	error = 0
	block = 100										' wait 100us each time
	request$ = "time"
	address = &request$
	writebytes = SIZE (request$)
'
	PRINT
	PRINT "#####  error = XinSocketWrite (socket, block, address, writebytes, flags, @bytes, @error)  #####"
'
	DO UNTIL error
		flags = 0
		bytes = 0
		error = 0
		error = XinSocketWrite (socket, block, address, writebytes, flags, @bytes)
'
		IFZ error THEN
			IF (bytes > 0) THEN
				writebytes = writebytes - bytes		' bytes left to send
				address = address + bytes					' move past written bytes
			END IF
		END IF
	LOOP UNTIL (writebytes <= 0)						' write again if necessary
'
	IF error THEN
		err = ERROR (0)
		IF err THEN error = err
	END IF
'
	PRINT
	PRINT "error                  = "; HEX$ (error, 8)
	PRINT "socket                 = "; HEX$ (socket, 8)
	PRINT "block                  = "; HEX$ (block, 8)
	PRINT "address                = "; HEX$ (address, 8)
	PRINT "maxbytes               = "; HEX$ (maxbytes, 8)
	PRINT "flags                  = "; HEX$ (flags, 8)
	PRINT "bytes                  = "; HEX$ (bytes, 8)
	PRINT "write                  = \""; LEFT$(request$,bytes); "\""
'
	IF error THEN
		XinSocketGetStatus (socket, 0, 0, 0, @status, 0, 0, 0)
		IFZ (status AND $$SocketStatusConnected) THEN
			XinSocketClose (socket)
			socket = 0
		END IF
	END IF
END SUB
'
'
' *****  ReadTimeStamp  *****
'
SUB ReadTimeStamp
	address = &buffer$
	maxbytes = SIZE (buffer$)
'
	PRINT
	PRINT "#####  error = XinSocketRead (socket, block, address, maxbytes, flags, @bytes, @error)  #####"
'
	DO UNTIL error
		flags = 0
		bytes = 0
		error = 0
		block = 100
		error = XinSocketRead (socket, block, address, maxbytes, flags, @bytes)
	LOOP UNTIL bytes
'
	time$ = LEFT$ (buffer$, bytes)
'
	IF error THEN
		err = ERROR (0)
		IF err THEN error = err
	END IF
'
	PRINT
	PRINT "error                  = "; HEX$ (error, 8)
	PRINT "socket                 = "; HEX$ (socket, 8)
	PRINT "block                  = "; HEX$ (block, 8)
	PRINT "address                = "; HEX$ (address, 8)
	PRINT "maxbytes               = "; HEX$ (maxbytes, 8)
	PRINT "flags                  = "; HEX$ (flags, 8)
	PRINT "bytes                  = "; HEX$ (bytes, 8)
	PRINT "read                   = \""; time$; "\""
'
	IF error THEN
		XinSocketGetStatus (socket, 0, 0, 0, @status, 0, 0, 0)
		IFZ (status AND $$SocketStatusConnected) THEN
			XinSocketClose (socket)
			socket = 0
		END IF
	END IF
END SUB
END FUNCTION
'
'
' #########################
' #####  Blowback ()  #####
' #########################
'
FUNCTION  Blowback ()
'
	PRINT
	PRINT "#####  aclient.x : Blowback()  #####"
'
	XinSocketClose (-1)		' close all my sockets
	XinSetDebug (0)				' turn off bug printer
END FUNCTION
END PROGRAM