OS/2 | If RxFuncQuery("SockLoadFuncs") Then Do Call RxFuncAdd "SockLoadFuncs","RXSOCK","SockLoadFuncs" Call SockLoadFuncs End |
VM | /* initialize socket interface for MYPROG EXEC */ Call Socket "Initialize", "MYPROG" |
Deregister socket interface:
OS/2 | Call SockDropFuncs |
VM | /* deregister socket interface for MYPROG EXEC */ Call Socket "Terminate" |
Create an unconnected socket:
OS/2 | Socket = SockSocket("AF_INET", "SOCK_STREAM", "0") |
VM | /* create a new socket and activate ASCII translation */ Parse Value Socket("Socket") With SockRc Sock Call Socket "SetSockOpt", Sock, "SOL_SOCKET", "SO_ASCII", "On" |
Connect a socket to a host/port address:
OS/2 | Host.!family = "AF_INET" Host.!address = "9.164.0.197" /* set remote host address */ Host.!port = 1996 Call SockConnect Socket, "Host.!" |
VM | Call Socket "Connect", Sock, "AF_INET 1996 9.164.0.197" |
Send a string over a socket:
OS/2 | Call SockSend Socket, "This is my test string" |
VM | Call Socket "Send", Sock, "This is my test string" |
Receive a string from a socket:
OS/2 | /* receive max. 1024 characters */ BytesRcvd = SockRecv(Socket, "InBuffer", 1024) Say InBuffer |
VM | Parse Value Socket("Recv", Sock) With SockRc BytesRcvd InBuffer Say InBuffer |
Shutdown a socket:
OS/2 | Call SockShutDown Socket, 2 |
VM | Call Socket "ShutDown", Sock |
Close a socket:
OS/2 | Call SockClose Socket |
VM | Call Socket "Close", Sock |
Bind a socket to a well known port on the server:
OS/2 | Host.!family = "AF_INET" Host.!port = 1996 Host.!address = "9.164.0.197" /* set local host address */ Call SockBind Socket, "Host.!" |
VM | LocalAddr = "9.164.0.197" Call Socket "Bind", Sock, "AF_INET 1996" LocalAddr |
Listen on a socket for a client connection request:
OS/2 | /* accept max. 5 clients simultaneously */ Call SockListen Socket, 5 |
VM | /* accept max. 5 clients simultaneously */ Call Socket "Listen", Sock, 5 |
Accept a connecting client:
OS/2 | ClientSock = SockAccept(Socket) |
VM | /* socket handling on VM is done via REXX/WAIT package! */ Parse Value Socket("Accept", Sock) With SockRc ClientSock ClientInfo |
Find out local IP address:
OS/2 | LocalAddr = SockGetHostId() |
VM | LocalAddr = Socket("GetHostId") |
Resolve a host name alias to an IP address:
OS/2 | Call SockGetHostByName "www2.hursley.ibm.com", "Host.!" Say Host.!addr |
VM | Parse Value Socket("GetHostByName", "www2.hursley.ibm.com") With SockRc HostAddr Say HostAddr |
This is the client program:
/* MCLIENT EXEC - IBM REXX Sample Program */ /* Parameters: */ /* Server: alias name of mirror server */ Parse Arg Server /* Initialize REXX Socket function package */ Call Socket "Initialize", "MCLIENT" /* Ask user for string to send to the mirror server */ Say "Please enter a string that should be mirrored" Parse Pull InpString /* create a TCP socket and activate ASCII translation */ Sock = Socket("Socket") Call Socket "SetSockOpt",Sock,"SOL_SOCKET","SO_ASCII","On" /* connect the new socket to the specified server */ Call Socket "Connect", Sock, "AF_INET 1996" Server /* send the input string to the mirror server */ Call Socket "Send", Sock, InpString /* receive answer from mirror server and close socket */ Parse Value Socket("Recv", Sock) With BytesRcvd OutString Call Socket "ShutDown", Sock Call Socket "Close", Sock Say "The string '" || InpString || "' was mirrored to" Say "'" || OutString || "'." /* deregister socket function package for this process */ Call Socket "Terminate" Exit /********************************************************/ /* */ /* Procedure: Socket */ /* Purpose: Forward the socket call and return the */ /* return string only, not the return code. */ /* Arguments: arguments to 'SOCKET' function */ /* Returns: return string of 'SOCKET' function */ /* without return code */ /* */ /********************************************************/ Socket: Procedure Expose SockRc a0 = Arg(1) a1 = Arg(2) a2 = Arg(3) a3 = Arg(4) a4 = Arg(5) a5 = Arg(6) a6 = Arg(7) a7 = Arg(8) a8 = Arg(9) a9 = Arg(10) Parse Value 'SOCKET'(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9) With SockRc Res Return ResAnd finally the server program:
/* MSERVER EXEC - IBM REXX Sample Program */ /* Initialize REXX Socket function package */ Call Socket "Initialize", "MSERVER" /* create a TCP socket for client connection requests */ Sock = Socket("Socket") Call Socket "SetSockOpt",Sock,"SOL_SOCKET","SO_ASCII","On" /* find out local IP address */ HostAddr = Socket("GetHostId") /* Bind socket to well known port 1996 */ Call Socket "Bind", Sock, "AF_INET 1996" HostAddr /* create a connection queue for 1 client */ Call Socket "Listen", Sock, 1 /* set mode of socket to non blocking */ Call SetValue "Socket" Sock "Non-Blocking" Say "Waiting for a client to connect..." /* now wait for a client to connect */ Do Forever /* wait for a socket read event or console input */ Event = Wait("Socket Read *", "Cons") Parse Upper Var Event WRc Event Rest Select When Event = "CONS" Then Do If Rest = "EXIT" Then Leave Else Say "Enter 'Exit' to leave program" End When Event = "SOCKET" Then Do Parse Var Rest KeyWord EvtSock If KeyWord = "READ" & EvtSock = Sock Then Do /* a client has connected to the request socket */ /* show info available on the client */ Parse Value Socket("Accept", Sock) with CltSock CltInfo Say "Client has established connection:" CltInfo /* we don't want more clients, close request socket */ Call Socket "ShutDown", Sock Call Socket "Close", Sock End If KeyWord = "READ" & EvtSock \= Sock Then Do /* a client has sent a string to mirror */ Parse Value Socket("Recv", EvtSock) with Bytes InpString Say "String read from client: '" || InpString || "'" OutString = Reverse(InpString) Call Socket "Send", EvtSock, OutString /* close the client socket */ Call Socket "ShutDown", EvtSocket Call Socket "Close", EvtSocket /* we have answered the request, quit program */ Leave End End Otherwise Nop End End /* deregister socket function package for this process */ Call Socket "Terminate" Exit /********************************************************/ /* */ /* Procedure: Socket */ /* Purpose: Forward the socket call and return the */ /* return string only, not the return code. */ /* Arguments: arguments to 'SOCKET' function */ /* Returns: return string of 'SOCKET' function */ /* without return code */ /* */ /********************************************************/ Socket: Procedure Expose SockRc a0 = Arg(1) a1 = Arg(2) a2 = Arg(3) a3 = Arg(4) a4 = Arg(5) a5 = Arg(6) a6 = Arg(7) a7 = Arg(8) a8 = Arg(9) a9 = Arg(10) Parse Value 'SOCKET'(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9) With SockRc Res Return Res