![]() Chapter Contents |
![]() Previous |
![]() Next |
| TCP/IP Socket Library Support for the CICS and Environment |
| Resident Functions Supported under CICS |
The following TCP/IP resident functions are supported under CICS without restrictions:
| _getlong | inet_addr | inet_netof | ntohs |
| _getshort | inet_lnaof | inet_ntoa | putlong |
| htoncs | inet_makeaddr | ntohcs | putshort |
| htonl | inet_network | ntohl | setsockimp |
| htons |
| Communications Functions |
The following TCP/IP communications functions are supported under CICS:
| accept | gethostbyaddr | getsockname | select |
| bind | gethostbyname | getsockopt | setsockopt |
| close | gethostid | givesocket | shutdown |
| connect | gethostname | ioctl | socket |
| fcntl | getpeername | listen | takesocket |
| getclientid |
| takesocket Function |
The
takesocket
function takes a socket descriptor from a donor process.
The socket descriptor must be a SAS/C socket
descriptor. If the descriptor is obtained directly from a donor process that
is not part of the SAS/C socket library,
the function may require TCP/IP vendor-dependent transformation.
Specifically for CICS, when the CICS TCP/IP listener task (CSKL) passes
a socket descriptor as member
give_take_socket
of the TCPSOCKET_PARM data, use
a
#define
statement to define the symbol
__IBM_TCPIP
within the
program or in the compilation parameters. This definition makes available
the macro FD_FROM_IBM_TCPIP(s) to convert an IBM socket descriptor to the
equivalent SAS/C descriptor for
takesocket
to use. The inverse macro FD_TO_IBM_TCPIP(s) is also available.
struct TCPSOCKET_PARM{
int give_take_socket; /* socket number given by listener */
char lstn_name[8]; /* listener name */
char lstn_subname[8]; /* listener subname */
char client_in_data[36]; /* client passed data */
struct sockaddr_in
sockaddr_in_parm; /* Internet socket address */
};
If
takesocket
succeeds, it returns a nonnegative SAS/C socket
descriptor. If it fails, it returns a -1 and sets
errno
to indicate the type
of error. For more information, see
SAS/C Library Reference, Volume 2 and the IBM publication TCP/IP Sockets Interface for CICS.
| takesocket Example |
#define __IBM_TCPIP 1
#include <cics.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
main()
{
int cs; /* client socket returned by takesocket */
int s; /* socket passed by the listener */
struct clientid clientid; /* return struct for clientid */
/* information */
char *cl_info;
/* variables used to obtain the time */
char *p;
int len;
time_t t;
int n_times; /* loop count */
char outbuf[128]; /* buffer for outgoing time string */
/* Map of parms passed to program by CICS listener via */
/* "EXEC CICS START" and picked up by "EXEC CICS RETRIEVE". */
struct TCPSOCKET_PARM{
int give_take_socket;
char lstn_name[8];
char lstn_subname[8];
char client_in_data[36];
struct sockaddr_in sockaddr_in_parm;
} csp; /* cics_socket_parm */
short csp_len = (short) sizeof(csp);
EXEC CICS RETRIEVE INTO(&csp) LENGTH(csp_len); /* Get parms. */
/* Build required CICS format clientid for takesocket. */
memset(clientid, 0, sizeof(clientid)); /* zero out clientid */
clientid.domain=AF_INET;
memcpy(clientid.name, csp.lstn_name, 8);
memcpy(clientid.subtaskname, csp.lstn_subname, 8);
printf("Passed clientid info: "
"Domain=%d, Name=<%.8s>, Task=<%.8s>, Resv=<%.20s>\n",
clientid.domain, clientid.name, clientid.subtaskname);
/* Convert IBM socket number to SAS/C socket number base. */
s = FD_FROM_IBM_TCPIP(csp.give_take_socket);
/* Take the passed client socket; takesocket returns a local */
/* socket number enabling us to write to the client. */
cs = takesocket(&clientid, s);
/* Check takesocket rc. */
if (cs == -1){
perror("takesock() call failed");
exit(EXIT_FAILURE);
}
n_times = 2;
while (n_times--){
/* Send the time to the client. Clients */
/* expect the string to be in ASCII. */
time(&t); /* machine-readable time */
p = ctime(&t); /* human-readable time */
/* Convert to ASCII if necessary. */
for (len=0; p[len] && len<sizeof(outbuf); len++)
outbuf[len] = htoncs(p[len];
outbuf[len+1] = htoncs('\n'); /* Send a new line. */
if (write(cs, outbuf, len)==-1){
perror("write() failed");
printf("Client IP address: %s\n",
inet_ntoa(csp.sockaddr_in_parm.sin_addr));
return EXIT_FAILURE;
}
}
close(cs);
return EXIT_SUCCESS; /* Avoid compilation warnings. */
}
![]() Chapter Contents |
![]() Previous |
![]() Next |
![]() Top of Page |
Copyright © 2001 by SAS Institute Inc., Cary, NC, USA. All rights reserved.