Metropoli BBS
VIEWER: test_c2.cmd MODE: TEXT (ASCII)
/*------------------------------------------------------------------
 * test_c.cmd :
 *------------------------------------------------------------------
 * 08-05-92 originally by Patrick J. Mueller
 *------------------------------------------------------------------*/

trace off

/*------------------------------------------------------------------
 * choose port number
 *------------------------------------------------------------------*/
port = 1923

/*------------------------------------------------------------------
 * initialize socket package
 *------------------------------------------------------------------*/
parse source os .

if (os = "OS/2") then
   do
   if RxFuncQuery("SockLoadFuncs") then
      do
      rc = RxFuncAdd("SockLoadFuncs","RxSock","SockLoadFuncs")
      rc = SockLoadFuncs()
      end
   end

if (os = "AIX/6000") then
   do
   rc = SysAddFuncPkg("rxsock.dll")
   end

/*------------------------------------------------------------------
 * get server name
 *------------------------------------------------------------------*/
parse arg server .

if (server = "?") then
   Usage()

if (server = "") then
   server = SockGetHostId()

else
   do
   rc = SockGetHostByName(server,"host.!")
   if (rc = 0) then
      do
      say "Error" h_errno "calling SockGetHostByName("server")"
      exit
      end

   server = host.!addr;
   end

/*---------------------------------------------------------------
 * open socket
 *---------------------------------------------------------------*/
socket  = SockSocket("AF_INET","SOCK_STREAM",0)
if (socket = -1) then
   do
   say "Error on SockSocket:" errno
   exit
   end

/*------------------------------------------------------------------
 * catch breaks
 *------------------------------------------------------------------*/
signal on halt

/*---------------------------------------------------------------
 * connect socket
 *---------------------------------------------------------------*/
server.!family = "AF_INET"
server.!port   = port
server.!addr   = server

rc = SockConnect(socket,"server.!")
if (rc = -1) then
   do
   say "Error on SockConnect:" errno
   exit
   end

/*---------------------------------------------------------------
 * set non-blocking mode
 *---------------------------------------------------------------*/
rc = SockIoctl(socket,"FIONBIO",1)

/*------------------------------------------------------------------
 * open another socket
 *------------------------------------------------------------------*/
socket2  = SockSocket("AF_INET","SOCK_STREAM",0)
rc = SockIoctl(socket2,"FIONBIO",1)

call doSelect socket, socket2
call doSelect socket, socket2, 0
call doSelect socket, socket2, 1

/*------------------------------------------------------------------
 * get some data to send over
 *------------------------------------------------------------------*/
data = random(10000,99999)

say "Sending  '"data"' to  " server

/*------------------------------------------------------------------
 * send the data over
 *------------------------------------------------------------------*/
rc = SockSend(socket,substr(data,1,2))

do x = 1 to 1000
   nop
end

rc = SockSend(socket,substr(data,3,3))

if (rc = -1) then
   do
   say "Error on SockSend:" errno
   exit
   end

/*------------------------------------------------------------------
 * receive the result from the server
 *------------------------------------------------------------------*/
newData = ""
do while (length(newData) < 5)
   rc = SockRecv(socket,"dataChunk",1000)
   say "received" length(dataChunk) "bytes"
   newData = newData || dataChunk
   call doSelect socket, socket2, 1
end

/*------------------------------------------------------------------
 * print results
 *------------------------------------------------------------------*/
if (reverse(data) <> newData) then
   say "Unexpected results from the server: '"newData"'"

else
   do
   say "Received '"newData"' from" server "(successful!!)"
   end

/*------------------------------------------------------------------
 * close socket (and catch signals)
 *------------------------------------------------------------------*/
halt:

rc = SockSoClose(socket)
if (rc = -1) then
   do
   say "Error on SockSoClose:" errno
   exit
   end

exit

/*------------------------------------------------------------------
 * call select
 *------------------------------------------------------------------*/
doSelect: procedure
   s.1 = arg(1)
   s.2 = arg(2)
   t   = arg(3)

   r.0 = 2
   w.0 = 2
   e.0 = 2

   do i = 1 to 2
      r.i = s.i
      w.i = s.i
      e.i = s.i
   end

   if (arg() = 2) then
      rc = SockSelect("r.","w.","e.")
   else
      rc = SockSelect("r.","w.","e.",t)

   say "rc =" rc "from SockSelect():"
   do i = 1 to r.0
      say "   ready for read:  " r.i
   end

   do i = 1 to w.0
      say "   ready for write: " w.i
   end

   do i = 1 to e.0
      say "   ready for except:" e.i
   end

   return ""


/*------------------------------------------------------------------
 * some simple help
 *------------------------------------------------------------------*/
Usage: procedure
   parse source . . me .

   say "usage:"
   say "   " me "<server>"
   say "is used to run the rxSock tester"
   say
   say "where:"
   say "   <server> - tcp/ip host name running test_s (default = current host)"

   exit
[ RETURN TO DIRECTORY ]