home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 18 REXX
/
18-REXX.zip
/
RXSOCK.ZIP
/
test_s2.cmd
< prev
Wrap
OS/2 REXX Batch file
|
1993-07-28
|
6KB
|
224 lines
/*------------------------------------------------------------------
* test_s.cmd :
*------------------------------------------------------------------
* 08-05-92 originally by Patrick J. Mueller
*------------------------------------------------------------------*/
trace off
/*------------------------------------------------------------------
* choose the port
*------------------------------------------------------------------*/
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
/*------------------------------------------------------------------
* create the initial socket
*------------------------------------------------------------------*/
s = SockSocket("AF_INET","SOCK_STREAM",0)
if (s = -1) then
do
say "Error on SockSocket:" errno
exit
end
/*------------------------------------------------------------------
* catch breaks
*------------------------------------------------------------------*/
signal on halt
/*------------------------------------------------------------------
* bind socket to port
*------------------------------------------------------------------*/
server.!family = "AF_INET"
server.!port = port
server.!addr = "INADDR_ANY"
rc = SockBind(s,"server.!")
if (rc = -1) then
do
say "Error on SockBind:" errno
exit
end
/*------------------------------------------------------------------
* set queue size
*------------------------------------------------------------------*/
rc = SockListen(s,10)
if (rc = -1) then
do
say "Error on SockListen:" errno
exit
end
/*------------------------------------------------------------------
* infinite loop to handle requests ...
*------------------------------------------------------------------*/
do forever
say "Waiting for client"
/*---------------------------------------------------------------
* accept a connection
*---------------------------------------------------------------*/
ns = SockAccept(s,"client.!")
if (ns = -1) then
do
say "Error on SockAccept:" errno
exit
end
/*---------------------------------------------------------------
* set non-blocking mode
*---------------------------------------------------------------*/
rc = SockIoctl(ns,"FIONBIO",1)
call doSelect s, ns
call doSelect s, ns, 0
call doSelect s, ns, 1
/*---------------------------------------------------------------
* get clients host name
*---------------------------------------------------------------*/
if SockGetHostByAddr(client.!addr,"host.!") then
clientName = host.!name
else
clientName = "Unknown"
say "Accepted client:" client.!addr clientName
/*---------------------------------------------------------------
* get peer host name
*---------------------------------------------------------------*/
rc = SockGetPeerName(ns,"peer.!")
if (rc = -1) then
do
say "Error on SockGetPeerName:" errno
/* exit */
end
say "PeerName:" peer.!addr
/*---------------------------------------------------------------
* get socket host name
*---------------------------------------------------------------*/
rc = SockGetSockName(ns,"sock.!")
if (rc = -1) then
do
say "Error on SockGetSockName:" errno
/* exit */
end
say "SockName:" sock.!addr
/*---------------------------------------------------------------
* receive data from client
*---------------------------------------------------------------*/
data = ""
do while (length(data) < 5)
call doSelect s, ns, 1
rc = SockRecv(ns,"dataChunk",1000)
say "received" length(dataChunk) "bytes"
data = data || dataChunk
end
say "Received:" data
data = reverse(data)
/*---------------------------------------------------------------
* send data back
*---------------------------------------------------------------*/
rc = SockSend(ns,substr(data,1,2))
do x = 1 to 1000
nop
end
rc = SockSend(ns,substr(data,3,3))
do x = 1 to 1000
nop
end
/*---------------------------------------------------------------
* close the new socket from client
*---------------------------------------------------------------*/
rc = SockSoClose(ns)
ns = ""
say "Closing connection"
say
end
/*------------------------------------------------------------------
* handle break by closing sockets
*------------------------------------------------------------------*/
halt:
say
say "Quitting ..."
rc = SockSoClose(s)
if datatype(ns,"W") then
rc = SockSoClose(ns)
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 ""