home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 18 REXX / 18-REXX.zip / rox.zip / socket.rox < prev    next >
Text File  |  1993-08-26  |  4KB  |  187 lines

  1. :class socket
  2.  
  3. :vars sock errno closed buffer cr lf crlf tab
  4.  
  5. :*------------------------------------------------------------------
  6. :*
  7. :*------------------------------------------------------------------
  8. :method init
  9.  
  10.    cr   = d2c(13)
  11.    lf   = d2c(10)
  12.    crlf = cr || lf
  13.    tab  = d2c(9)
  14.  
  15.    closed = 0
  16.    buffer = ""
  17.  
  18.    /*---------------------------------------------------------------
  19.     * initialize function package
  20.     *---------------------------------------------------------------*/
  21.    if RxFuncQuery("SockLoadFuncs") then
  22.       do
  23.       rc = RxFuncAdd("SockLoadFuncs","rxSock","SockLoadFuncs")
  24.       rc = SockLoadFuncs()
  25.       end
  26.  
  27.    /*---------------------------------------------------------------
  28.     * handle case of initializing socket with a socket value
  29.     *---------------------------------------------------------------*/
  30.    if datatype(arg(1),"W") then
  31.       do
  32.       sock  = arg(1)
  33.       errno = 0
  34.       return
  35.       end
  36.  
  37.    sock = SockSocket("AF_INET","SOCK_STREAM","IPPROTO_TCP")
  38.  
  39.    return
  40.  
  41. :*------------------------------------------------------------------
  42. :*
  43. :*------------------------------------------------------------------
  44. :method deinit
  45.    return SockClose(sock)
  46.  
  47. :*------------------------------------------------------------------
  48. :*
  49. :*------------------------------------------------------------------
  50. :method errno
  51.    return errno
  52.  
  53. :*------------------------------------------------------------------
  54. :*
  55. :*------------------------------------------------------------------
  56. :method closed
  57.    return closed
  58.  
  59. :*------------------------------------------------------------------
  60. :*
  61. :*------------------------------------------------------------------
  62. :method bindServer
  63.    port = arg(1)
  64.  
  65.    server.!family = "AF_INET"
  66.    server.!port   = port
  67.    server.!addr   = "INADDR_ANY"
  68.  
  69.    rc = SockBind(sock,"server.!")
  70.  
  71.    if (rc = 0) then
  72.       rc = SockListen(sock,10)
  73.  
  74.    return rc
  75.  
  76. :*------------------------------------------------------------------
  77. :*
  78. :*------------------------------------------------------------------
  79. :method acceptCLient
  80.  
  81.    signal on halt
  82.  
  83.    newSock = SockAccept(sock,"client.!")
  84.  
  85.    if (newSock = -1) then
  86.       return ""
  87.  
  88.    return  RoxCreate("socket",newSock)
  89.  
  90.    halt:
  91.    return ""
  92.  
  93. :*------------------------------------------------------------------
  94. :*
  95. :*------------------------------------------------------------------
  96. :method connectServer
  97.    host = arg(1)
  98.    port = arg(2)
  99.  
  100.    /*---------------------------------------------------------------
  101.     * convert name to address, if needed
  102.     *---------------------------------------------------------------*/
  103.    if (0 <> verify(host,"0123456789.")) then
  104.       do
  105.       rc = SockGetHostByName(host,"addr.!")
  106.       if (rc <> 1) then
  107.          return -1
  108.       host = addr.!addr
  109.       end
  110.  
  111.    addr.!family = "AF_INET"
  112.    addr.!port   = port
  113.    addr.!addr   = host
  114.  
  115.    rc = SockConnect(sock,"addr.!")
  116.  
  117.    return rc
  118.  
  119. :*------------------------------------------------------------------
  120. :*
  121. :*------------------------------------------------------------------
  122. :method sendString
  123.    string = arg(1)
  124.  
  125.    origLen = length(string)
  126.  
  127.    do while (string <> "")
  128.  
  129.       rc = SockSend(sock,string)
  130.       if (rc = -1) then
  131.          return -1
  132.  
  133.       if (rc = 0) then
  134.          do
  135.          closed = 1
  136.          return length(string)
  137.          end
  138.  
  139.       string = substr(string,rc+1)
  140.    end
  141.  
  142.    return 0
  143.  
  144. :*------------------------------------------------------------------
  145. :*
  146. :*------------------------------------------------------------------
  147. :method sendLine
  148.    string = arg(1) || crlf
  149.  
  150.    return .sendString(self,string)
  151.  
  152. :*------------------------------------------------------------------
  153. :*
  154. :*------------------------------------------------------------------
  155. :method recv
  156.    rc = SockRecv(sock,"data",1000)
  157.  
  158.    if (rc < 0) then
  159.        return ""
  160.  
  161.    if (rc = 0) then
  162.       do
  163.       closed = 1
  164.       return ""
  165.       end
  166.  
  167.    return data
  168.  
  169. :*------------------------------------------------------------------
  170. :*
  171. :*------------------------------------------------------------------
  172. :method recvLine
  173.    line = buffer
  174.  
  175.  
  176.    do while (pos(crlf,line) = 0)
  177.  
  178.       line = .recv(self)
  179.  
  180.       if .closed(self) then
  181.          return line
  182.    end
  183.  
  184.    parse var line line (crlf) buffer
  185.    return line
  186.  
  187.