home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 August / PCWorld_2000-08_cd.bin / Software / TemaCD / xbasic / xbpro.exe / xb / aclient.x < prev    next >
Text File  |  1999-11-25  |  12KB  |  394 lines

  1. '
  2. ' ####################
  3. ' #####  PROLOG  #####
  4. ' ####################
  5. '
  6. PROGRAM    "aclient"
  7. VERSION    "0.0001"
  8. '
  9. IMPORT    "xst"
  10. IMPORT  "xin"
  11. IMPORT    "xui"
  12. '
  13. ' IMPORTANT : The Windows XBasic "xin" sockets/network/internet
  14. ' function library is disabled if file "c:/windows/xb.ini" exits
  15. ' and contains the line "xin=false".  The best way to enable the
  16. ' "xin" function library is to comment-out that line with a '
  17. ' comment-character prefix - change "xin=false" to "' xin=false".
  18. ' You can then re-disable the "xin" library if you wish by simply
  19. ' removing the ' comment character.  Why is this silly "xin=false"
  20. ' initialization-string needed?  For unknown reasons, in computers
  21. ' that do not have TCP/IP networking but DO have dial-up networking,
  22. ' initialization in "xin" malfunctions unless a dial-up connection
  23. ' has been made since the computer started.  Why is unclear, and
  24. ' hopefully this silly workaround can be eliminated someday.
  25. '
  26. ' This "aclient.x" program is a client to the "aserver.x" server
  27. ' program to test and demonstrate the simplest possible client
  28. ' and server programs.  The "aserver.x" server program is on
  29. ' port 0x2020 and all it does is send a time stamp string when
  30. ' it receives a "time" request from a client.
  31. '
  32. ' You will need to change the $$SERVER_ADDRESS constant below to
  33. ' the IP address of the system running the "aserver.x" program.
  34. ' If you do not know the "dot notation" IP address of the system
  35. ' running "aserver.x", enter "ping systemname" at the command
  36. ' prompt on that system to make it print.
  37. '
  38. '
  39. DECLARE FUNCTION  Entry      ( )
  40. DECLARE FUNCTION  Blowback   ( )
  41. '
  42. ' remember, you need to change $$SERVER_ADDRESS below
  43. '
  44.     $$SERVER_PORT    = 0x2020                ' port # of "aserver.x"
  45.     $$SERVER_ADDRESS = "76.7.4.3"        ' IP address of "aserver.x"
  46. '
  47. '
  48. ' ######################
  49. ' #####  Entry ()  #####
  50. ' ######################
  51. '
  52. FUNCTION  Entry ()
  53.     HOST  host
  54. '
  55.     XinSetDebug (1)                            ' print info
  56.     socket = $$FALSE                        ' no server socket yet
  57.     connected = $$FALSE                    ' not connected to server yet
  58.     buffer$ = NULL$ (255)                ' place to capture timestamp string
  59. '
  60.     GOSUB ClearConsole                    ' clear console for readability
  61.     GOSUB PrintBanner                        ' print aclient.x startup banner
  62.     GOSUB Initialize                        ' initialize network function library
  63.     GOSUB PrintLocalHostInfo        ' print information about this system
  64.     GOSUB PrintNetworkAddress        ' print network address of this system
  65.     GOSUB OpenSocket                        ' open a network communications socket
  66.     GOSUB BindSocket                        ' bind the socket to a local port
  67.     GOSUB ConnectRequest                ' request connection to server
  68. '
  69.     DO UNTIL connected
  70.         GOSUB ConnectStatus                ' wait for connection to server
  71.     LOOP
  72. '
  73.     GOSUB GetAddresses                    ' get client/server address and port
  74. '
  75.     FOR i = 0 TO 3                            ' request 4 timestamp strings
  76.         GOSUB WriteTimeRequest        ' write "time" to timestamp server
  77.         IFZ socket THEN EXIT FOR    ' were we rudely disconnected ???
  78.         GOSUB ReadTimeStamp                ' read reply timestamp string
  79.         IFZ socket THEN EXIT FOR    ' were we rudely disconnected ???
  80.     NEXT i                                            '
  81. '
  82.     Blowback ()
  83.     RETURN
  84. '
  85. '
  86. ' *****  ClearConsole  *****
  87. '
  88. SUB ClearConsole
  89.     XstGetConsoleGrid (@console)
  90.     XuiSendStringMessage (console, @"SetTextArray", 0, 0, 0, 0, 0, 0)
  91.     XuiSendStringMessage (console, @"Redraw", 0, 0, 0, 0, 0, 0)
  92. END SUB
  93. '
  94. ' *****  PrintBanner  *****
  95. '
  96. SUB PrintBanner
  97.     PRINT
  98.     PRINT "####################################################"
  99.     PRINT "#####  XBasic Network Functions Test : Client  #####"
  100.     PRINT "####################################################"
  101. END SUB
  102. '
  103. '
  104. ' *****  Initialize  *****
  105. '
  106. SUB Initialize
  107.     PRINT
  108.     PRINT "#####  Xin ()  #####"
  109.     PRINT "#####  XinInitialize (@local, @hosts, @sockets, @version, @comments$, @notes$)  #####"
  110. '
  111.     Xin ()
  112.     XinInitialize (@local, @hosts, @version, @sockets, @comments$, @notes$)
  113. '
  114. ' *****  print basic network information  *****
  115. '
  116.     PRINT
  117.     PRINT "local                  = "; HEX$ (local,8)
  118.     PRINT "hosts                  = "; HEX$ (hosts,8)
  119.     PRINT "sockets                = "; HEX$ (sockets,8)
  120.     PRINT "version                = "; HEX$ (version,8)
  121.     PRINT "comments$              = "; comments$
  122.     PRINT "notes$                 = "; notes$
  123. END SUB
  124. '
  125. '
  126. ' *****  PrintLocalHostInfo  *****
  127. '
  128. SUB PrintLocalHostInfo
  129.     PRINT
  130.     PRINT "#####  XinHostNumberToInfo (base, @info)  #####"
  131. '
  132.     XinHostNumberToInfo (0, @host)
  133.     hostaddress = host.address
  134.     address$$ = host.address
  135.     host$ = host.name
  136. '
  137.     PRINT
  138.     PRINT "host.name              = \""; host.name; "\""
  139.     PRINT "host.alias[0]          = \""; host.alias[0]; "\""
  140.     PRINT "host.alias[1]          = \""; host.alias[1]; "\""
  141.     PRINT "host.alias[2]          = \""; host.alias[2]; "\""
  142.     PRINT "host.system            = \""; host.system; "\""
  143.     PRINT "host.hostnumber        = "; HEX$ (host.hostnumber,8)
  144.     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)
  145. '
  146.     FOR i = 0 TO 7
  147.         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)
  148.     NEXT i
  149. '
  150.     PRINT "host.addressBytes      = "; HEX$ (host.addressBytes,8)
  151.     PRINT "host.addressFamily     = "; HEX$ (host.addressFamily,8)
  152.     PRINT "host.protocolFamily    = "; HEX$ (host.protocolFamily,8)
  153.     PRINT "host.protocol          = "; HEX$ (host.protocol,8)
  154. END SUB
  155. '
  156. '
  157. ' *****  PrintNetworkAddress  *****
  158. '
  159. SUB PrintNetworkAddress
  160.     PRINT
  161.     XinAddressNumberToString (@address$$, @address$)
  162.     PRINT "<"; HEX$(address$$,16); "> <"; address$; "> <";
  163.     XinAddressStringToNumber (@address$, @addr$$)
  164.     PRINT address$; "> <"; HEX$(addr$$,16); ">"
  165. END SUB
  166. '
  167. '
  168. ' *****  OpenSocket  *****
  169. '
  170. SUB OpenSocket
  171.     PRINT
  172.     PRINT "#####  error = XinSocketOpen (@socket, addressType, socketType, flags)  #####"
  173. '
  174.     flags = 0
  175.     socketType = 0
  176.     addressType = 0
  177.     error = XinSocketOpen (@socket, @addressType, @socketType, flags)
  178. '
  179.     PRINT
  180.     PRINT "error                  = "; HEX$ (error, 8)
  181.     PRINT "socket                 = "; HEX$ (socket, 8)
  182.     PRINT "addressType            = "; HEX$ (addressType, 8)
  183.     PRINT "socketType             = "; HEX$ (socketType, 8)
  184.     PRINT "flags                  = "; HEX$ (flags, 8)
  185. '
  186.     IF error THEN
  187.         Blowback ()
  188.         RETURN
  189.     END IF
  190. END SUB
  191. '
  192. '
  193. ' *****  BindSocket  *****
  194. '
  195. SUB BindSocket
  196.     PRINT
  197.     PRINT "#####  error = XinSocketBind (socket, block, @address$$, @port)  #####"
  198. '
  199.     port = 0
  200.     address = 0
  201.     error = XinSocketBind (socket, block, @address$$, @port)
  202. '
  203.     PRINT
  204.     PRINT "error                  = "; HEX$ (error, 8)
  205.     PRINT "socket                 = "; HEX$ (socket, 8)
  206.     PRINT "address                = "; HEX$ (address, 8)
  207.     PRINT "port                   = "; HEX$ (port, 8)
  208. '
  209.     IF error THEN
  210.         Blowback ()
  211.         RETURN
  212.     END IF
  213. END SUB
  214. '
  215. '
  216. ' *****  ConnectRequest  *****
  217. '
  218. SUB ConnectRequest
  219.     XinAddressStringToNumber (@$$SERVER_ADDRESS, @serveraddress$$)
  220.     serverport = $$SERVER_PORT
  221.     block = 0
  222. '
  223.     PRINT
  224.     PRINT "#####  error = XinSocketConnectRequest (socket, block, serveraddress$$, serverport)  #####"
  225.  
  226.     error = XinSocketConnectRequest (socket, block, serveraddress$$, serverport)
  227. '
  228.     PRINT
  229.     PRINT "error                  = "; HEX$ (error, 8)
  230.     PRINT "socket                 = "; HEX$ (socket, 8)
  231.     PRINT "block                  = "; HEX$ (block, 8)
  232.     PRINT "serveraddress$$        = "; HEX$ (serveraddress$$, 16)
  233.     PRINT "serverport             = "; HEX$ (serverport, 8)
  234. '
  235.     IF error THEN
  236.         Blowback ()
  237.         RETURN
  238.     END IF
  239. END SUB
  240. '
  241. '
  242. ' *****  ConnectStatus  ******
  243. '
  244. SUB ConnectStatus
  245.     error = 0
  246.     block = 100
  247.     error = XinSocketConnectStatus (socket, block, @connected)
  248. '
  249.     IF (error OR connected) THEN
  250.         PRINT
  251.         PRINT "#####  error = XinSocketConnectStatus (socket, block, @connected)  #####"
  252. '
  253.         PRINT
  254.         PRINT "error                  = "; HEX$ (error, 8)
  255.         PRINT "socket                 = "; HEX$ (socket, 8)
  256.         PRINT "block                  = "; HEX$ (block, 8)
  257.         PRINT "connected              = "; HEX$ (connected, 8)
  258.     END IF
  259. '
  260.     IF error THEN
  261.         Blowback ()
  262.         RETURN
  263.     END IF
  264. END SUB
  265. '
  266. '
  267. ' *****  GetAddresses  *****
  268. '
  269. SUB GetAddresses
  270.     PRINT
  271.     PRINT "#####  error = XinSocketGetAddress (socket, @port, @address$$, @remote, @rport, @raddress$$)  #####"
  272. '
  273.     error = XinSocketGetAddress (socket, @port, @address$$, @remote, @rport, @raddress$$)
  274. '
  275.     PRINT
  276.     PRINT "error                  = "; HEX$ (error, 8)
  277.     PRINT "port                   = "; HEX$ (port, 8)
  278.     PRINT "address$$              = "; HEX$ (address$$, 16)
  279.     PRINT "rport                  = "; HEX$ (rport, 8)
  280.     PRINT "raddress$$             = "; HEX$ (raddress$$, 16)
  281. END SUB
  282. '
  283. '
  284. ' *****  WriteTimeRequest  *****
  285. '
  286. SUB WriteTimeRequest
  287.     sent = 0
  288.     error = 0
  289.     block = 100                                        ' wait 100us each time
  290.     request$ = "time"
  291.     address = &request$
  292.     writebytes = SIZE (request$)
  293. '
  294.     PRINT
  295.     PRINT "#####  error = XinSocketWrite (socket, block, address, writebytes, flags, @bytes, @error)  #####"
  296. '
  297.     DO UNTIL error
  298.         flags = 0
  299.         bytes = 0
  300.         error = 0
  301.         error = XinSocketWrite (socket, block, address, writebytes, flags, @bytes)
  302. '
  303.         IFZ error THEN
  304.             IF (bytes > 0) THEN
  305.                 writebytes = writebytes - bytes        ' bytes left to send
  306.                 address = address + bytes                    ' move past written bytes
  307.             END IF
  308.         END IF
  309.     LOOP UNTIL (writebytes <= 0)                        ' write again if necessary
  310. '
  311.     IF error THEN
  312.         err = ERROR (0)
  313.         IF err THEN error = err
  314.     END IF
  315. '
  316.     PRINT
  317.     PRINT "error                  = "; HEX$ (error, 8)
  318.     PRINT "socket                 = "; HEX$ (socket, 8)
  319.     PRINT "block                  = "; HEX$ (block, 8)
  320.     PRINT "address                = "; HEX$ (address, 8)
  321.     PRINT "maxbytes               = "; HEX$ (maxbytes, 8)
  322.     PRINT "flags                  = "; HEX$ (flags, 8)
  323.     PRINT "bytes                  = "; HEX$ (bytes, 8)
  324.     PRINT "write                  = \""; LEFT$(request$,bytes); "\""
  325. '
  326.     IF error THEN
  327.         XinSocketGetStatus (socket, 0, 0, 0, @status, 0, 0, 0)
  328.         IFZ (status AND $$SocketStatusConnected) THEN
  329.             XinSocketClose (socket)
  330.             socket = 0
  331.         END IF
  332.     END IF
  333. END SUB
  334. '
  335. '
  336. ' *****  ReadTimeStamp  *****
  337. '
  338. SUB ReadTimeStamp
  339.     address = &buffer$
  340.     maxbytes = SIZE (buffer$)
  341. '
  342.     PRINT
  343.     PRINT "#####  error = XinSocketRead (socket, block, address, maxbytes, flags, @bytes, @error)  #####"
  344. '
  345.     DO UNTIL error
  346.         flags = 0
  347.         bytes = 0
  348.         error = 0
  349.         block = 100
  350.         error = XinSocketRead (socket, block, address, maxbytes, flags, @bytes)
  351.     LOOP UNTIL bytes
  352. '
  353.     time$ = LEFT$ (buffer$, bytes)
  354. '
  355.     IF error THEN
  356.         err = ERROR (0)
  357.         IF err THEN error = err
  358.     END IF
  359. '
  360.     PRINT
  361.     PRINT "error                  = "; HEX$ (error, 8)
  362.     PRINT "socket                 = "; HEX$ (socket, 8)
  363.     PRINT "block                  = "; HEX$ (block, 8)
  364.     PRINT "address                = "; HEX$ (address, 8)
  365.     PRINT "maxbytes               = "; HEX$ (maxbytes, 8)
  366.     PRINT "flags                  = "; HEX$ (flags, 8)
  367.     PRINT "bytes                  = "; HEX$ (bytes, 8)
  368.     PRINT "read                   = \""; time$; "\""
  369. '
  370.     IF error THEN
  371.         XinSocketGetStatus (socket, 0, 0, 0, @status, 0, 0, 0)
  372.         IFZ (status AND $$SocketStatusConnected) THEN
  373.             XinSocketClose (socket)
  374.             socket = 0
  375.         END IF
  376.     END IF
  377. END SUB
  378. END FUNCTION
  379. '
  380. '
  381. ' #########################
  382. ' #####  Blowback ()  #####
  383. ' #########################
  384. '
  385. FUNCTION  Blowback ()
  386. '
  387.     PRINT
  388.     PRINT "#####  aclient.x : Blowback()  #####"
  389. '
  390.     XinSocketClose (-1)        ' close all my sockets
  391.     XinSetDebug (0)                ' turn off bug printer
  392. END FUNCTION
  393. END PROGRAM
  394.