home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 18 REXX / 18-REXX.zip / RXSOCK.ZIP / test_s2.cmd < prev   
OS/2 REXX Batch file  |  1993-07-28  |  6KB  |  224 lines

  1. /*------------------------------------------------------------------
  2.  * test_s.cmd :
  3.  *------------------------------------------------------------------
  4.  * 08-05-92 originally by Patrick J. Mueller
  5.  *------------------------------------------------------------------*/
  6.  
  7. trace off
  8.  
  9. /*------------------------------------------------------------------
  10.  * choose the port
  11.  *------------------------------------------------------------------*/
  12. port = 1923
  13.  
  14. /*------------------------------------------------------------------
  15.  * initialize socket package
  16.  *------------------------------------------------------------------*/
  17. parse source os .
  18.  
  19. if (os = "OS/2") then
  20.    do
  21.    if RxFuncQuery("SockLoadFuncs") then
  22.       do
  23.       rc = RxFuncAdd("SockLoadFuncs","RxSock","SockLoadFuncs")
  24.       rc = SockLoadFuncs()
  25.       end
  26.    end
  27.  
  28. if (os = "AIX/6000") then
  29.    do
  30.    rc = SysAddFuncPkg("rxsock.dll")
  31.    end
  32.  
  33. /*------------------------------------------------------------------
  34.  * create the initial socket
  35.  *------------------------------------------------------------------*/
  36. s  = SockSocket("AF_INET","SOCK_STREAM",0)
  37. if (s = -1) then
  38.    do
  39.    say "Error on SockSocket:" errno
  40.    exit
  41.    end
  42.  
  43. /*------------------------------------------------------------------
  44.  * catch breaks
  45.  *------------------------------------------------------------------*/
  46. signal on halt
  47.  
  48. /*------------------------------------------------------------------
  49.  * bind socket to port
  50.  *------------------------------------------------------------------*/
  51. server.!family = "AF_INET"
  52. server.!port   = port
  53. server.!addr   = "INADDR_ANY"
  54.  
  55. rc = SockBind(s,"server.!")
  56. if (rc = -1) then
  57.    do
  58.    say "Error on SockBind:" errno
  59.    exit
  60.    end
  61.  
  62. /*------------------------------------------------------------------
  63.  * set queue size
  64.  *------------------------------------------------------------------*/
  65. rc = SockListen(s,10)
  66. if (rc = -1) then
  67.    do
  68.    say "Error on SockListen:" errno
  69.    exit
  70.    end
  71.  
  72. /*------------------------------------------------------------------
  73.  * infinite loop to handle requests ...
  74.  *------------------------------------------------------------------*/
  75. do forever
  76.    say "Waiting for client"
  77.  
  78.    /*---------------------------------------------------------------
  79.     * accept a connection
  80.     *---------------------------------------------------------------*/
  81.    ns = SockAccept(s,"client.!")
  82.    if (ns = -1) then
  83.       do
  84.       say "Error on SockAccept:" errno
  85.       exit
  86.       end
  87.  
  88.    /*---------------------------------------------------------------
  89.     * set non-blocking mode
  90.     *---------------------------------------------------------------*/
  91.    rc = SockIoctl(ns,"FIONBIO",1)
  92.  
  93.    call doSelect s, ns
  94.    call doSelect s, ns, 0
  95.    call doSelect s, ns, 1
  96.  
  97.    /*---------------------------------------------------------------
  98.     * get clients host name
  99.     *---------------------------------------------------------------*/
  100.    if SockGetHostByAddr(client.!addr,"host.!") then
  101.       clientName = host.!name
  102.    else
  103.       clientName = "Unknown"
  104.  
  105.    say "Accepted client:" client.!addr clientName
  106.  
  107.    /*---------------------------------------------------------------
  108.     * get peer host name
  109.     *---------------------------------------------------------------*/
  110.    rc = SockGetPeerName(ns,"peer.!")
  111.    if (rc = -1) then
  112.       do
  113.       say "Error on SockGetPeerName:" errno
  114. /*    exit */
  115.       end
  116.  
  117.    say "PeerName:" peer.!addr
  118.  
  119.    /*---------------------------------------------------------------
  120.     * get socket host name
  121.     *---------------------------------------------------------------*/
  122.    rc = SockGetSockName(ns,"sock.!")
  123.    if (rc = -1) then
  124.       do
  125.       say "Error on SockGetSockName:" errno
  126. /*    exit */
  127.       end
  128.  
  129.    say "SockName:" sock.!addr
  130.  
  131.    /*---------------------------------------------------------------
  132.     * receive data from client
  133.     *---------------------------------------------------------------*/
  134.    data = ""
  135.    do while (length(data) < 5)
  136.       call doSelect s, ns, 1
  137.       rc = SockRecv(ns,"dataChunk",1000)
  138.       say "received" length(dataChunk) "bytes"
  139.       data = data || dataChunk
  140.    end
  141.  
  142.    say "Received:" data
  143.  
  144.    data = reverse(data)
  145.  
  146.    /*---------------------------------------------------------------
  147.     * send data back
  148.     *---------------------------------------------------------------*/
  149.    rc = SockSend(ns,substr(data,1,2))
  150.  
  151.    do x = 1 to 1000
  152.       nop
  153.    end
  154.  
  155.    rc = SockSend(ns,substr(data,3,3))
  156.  
  157.    do x = 1 to 1000
  158.       nop
  159.    end
  160.  
  161.    /*---------------------------------------------------------------
  162.     * close the new socket from client
  163.     *---------------------------------------------------------------*/
  164.    rc = SockSoClose(ns)
  165.    ns = ""
  166.  
  167.    say "Closing connection"
  168.    say
  169. end
  170.  
  171. /*------------------------------------------------------------------
  172.  * handle break by closing sockets
  173.  *------------------------------------------------------------------*/
  174. halt:
  175.  
  176. say
  177. say "Quitting ..."
  178.  
  179. rc = SockSoClose(s)
  180.  
  181. if datatype(ns,"W") then
  182.    rc = SockSoClose(ns)
  183.  
  184. exit
  185.  
  186. /*------------------------------------------------------------------
  187.  * call select
  188.  *------------------------------------------------------------------*/
  189. doSelect: procedure
  190.    s.1 = arg(1)
  191.    s.2 = arg(2)
  192.    t   = arg(3)
  193.  
  194.    r.0 = 2
  195.    w.0 = 2
  196.    e.0 = 2
  197.  
  198.    do i = 1 to 2
  199.       r.i = s.i
  200.       w.i = s.i
  201.       e.i = s.i
  202.    end
  203.  
  204.    if (arg() = 2) then
  205.       rc = SockSelect("r.","w.","e.")
  206.    else
  207.       rc = SockSelect("r.","w.","e.",t)
  208.  
  209.    say "rc =" rc "from SockSelect():"
  210.    do i = 1 to r.0
  211.       say "   ready for read:  " r.i
  212.    end
  213.  
  214.    do i = 1 to w.0
  215.       say "   ready for write: " w.i
  216.    end
  217.  
  218.    do i = 1 to e.0
  219.       say "   ready for except:" e.i
  220.    end
  221.  
  222.    return ""
  223.  
  224.