![Content starts here](http://welcome.hp-ww.com/img/s.gif) |
Compaq TCP/IP Services for OpenVMS Sockets API
and System Services Programming
E.2.2 TCP Server
Example E-5 shows how a typical TCP IPv4 server uses $QIO system
services to handle the tasks of creating a socket, accepting or
rejecting client connections, writing client connection data, and then
terminating client connections.
Example E-5 TCP Server (System Services) |
#pragma module tcpip$tcp_server_qio \
"V5.1-00"
/*
* Copyright 2000 Compaq Computer Corporation
*
* COMPAQ Registered in U.S. Patent and Trademark Office.
*
* Confidential computer software. Valid license from Compaq
* or authorized sublicensor required for possession, use or
* copying. Consistent with FAR 12.211 and 12.212, Commercial
* Computer Software, Computer Software Documentation, and
* Technical Data for Commercial Items are licensed to the
* U.S. Government under vendor's standard commercial license.
*
* ++
* FACILITY:
*
* EXAMPLES
*
* ABSTRACT:
*
* This is an example of a TCP/IP IPv4 server using OpenVMS
* QIO system services to handle network I/O operations.
*
* Refer to 'Build, Configuration, and Run Instructions' for
* details on how to build, configure, and run this program.
*
* ENVIRONMENT:
*
* OpenVMS Alpha/VAX V7.1
* TCP/IP Services V5.0 or higher
*
* AUTHOR:
*
* TCPIP Development Group, CREATION DATE: 23-May-1989
*
* --
*/
/* Build, Configuration, and Run Instructions */
/*
* BUILD INSTRUCTIONS:
*
* To build this example program use commands of the form,
*
* using the DEC "C" compiler:
*
* $ cc/prefix=all TCPIP$TCP_SERVER_QIO.C
* $ link TCPIP$TCP_SERVER_QIO
*
* using the DEC "C++" compiler:
*
* $ cxx/prefix=all/define=VMS TCPIP$TCP_SERVER_QIO.C
* $ link TCPIP$TCP_SERVER_QIO
*
*
* CONFIGURATION INSTRUCTIONS:
*
* No special configuration required.
*
*
* RUN INSTRUCTIONS:
*
* To run this example program:
*
* 1) Start this server program as shown below:
*
* $ run tcpip$tcp_server_qio
* Waiting for a client connection on port: m
*
* 2) After the server program blocks, start the client program,
* entering the server host as shown below:
*
* $ run tcpip$tcp_client_qio
* Enter remote host:
*
* Note: You can specify a server host by using either an IPv4
* address in dotted-decimal notation (e.g. 16.20.10.56)
* or a host domain name (e.g. serverhost.compaq.com).
*
* 3) The server program then displays client connection information
* and client data as shown below:
*
* Accepted connection from host: a.b.c.d, port: n
* Data sent: Hello, world!
*
* You can enter "ctrl/z" at any user prompt to terminate program
* execution.
*
*/
/*
* INCLUDE FILES:
*/
#include <descrip.h> /* define OpenVMS descriptors */
#include <efndef.h> /* define 'EFN$C_ENF' event flag */
#include <in.h> /* define internet related constants, */
/* functions, and structures */
#include <inet.h> /* define network address info */
#include <iodef.h> /* define i/o function codes */
#include <netdb.h> /* define network database library info */
#include <ssdef.h> /* define system service status codes */
#include <starlet.h> /* define system service calls */
#include <stdio.h> /* define standard i/o functions */
#include <stdlib.h> /* define standard library functions */
#include <string.h> /* define string handling functions */
#include <stsdef.h> /* define condition value fields */
#include <tcpip$inetdef.h> /* define tcp/ip network constants, */
/* structures, and functions */
/*
* NAMED CONSTANTS:
*/
#define SERV_BACKLOG 1 /* server backlog */
#define SERV_PORTNUM 12345 /* server port number */
/*
* STRUCTURE DEFINITIONS:
*/
struct iosb
{ /* i/o status block */
unsigned short status; /* i/o completion status */
unsigned short bytcnt; /* bytes transferred if read/write */
void *details; /* address of buffer or parameter */
};
struct itemlst_2
{ /* item-list 2 descriptor/element */
unsigned short length; /* length */
unsigned short type; /* parameter type */
void *address; /* address of item list */
};
struct itemlst_3
{ /* item-list 3 descriptor/element */
unsigned short length; /* length */
unsigned short type; /* parameter type */
void *address; /* address of item list */
unsigned int *retlen; /* address of returned length */
};
struct sockchar
{ /* socket characteristics buffer */
unsigned short prot; /* protocol */
unsigned char type; /* type */
unsigned char af; /* address format */
};
/*
* FORWARD REFERENCES:
*/
int main( void ); /* server main */
/* Server Main */
/*
* FUNCTIONAL DESCRIPTION:
*
* This is the server's main-line code. It handles all the tasks of the
* server including: socket creation, accepting and/or rejecting client
* connections, writing client connection data, and terminating client
* connections.
*
* This example program implements a typical TCP IPv4 server using QIO
* system services to handle network i/o operations as shown below:
*
* 1) To create a socket and set REUSEADDR option:
*
* sys$assign() and sys$qiow(IO$_SETMODE)
*
* 2) To bind internet address and port number to a socket:
*
* sys$qiow(IO$_SETMODE)
*
* 3) To accept a connection request:
*
* sys$qiow(IO$_ACCESS|IO$M_ACCEPT)
*
* 4) To transfer data:
*
* sys$qiow(IO$_WRITEVBLK)
*
* 5) To shutdown a socket:
*
* sys$qiow(IO$_DEACCESS|IO$M_SHUTDOWN)
*
* 6) To close and delete a socket:
*
* sys$qiow(IO$_DEACCESS) and sys$dassgn()
*
* This function is invoked by the DCL "RUN" command (see below); the
* function's completion status is interpreted by DCL and if needed,
* an error message is displayed.
*
* SYNOPSIS:
*
* int main( void )
*
* FORMAL PARAMETERS:
*
* ** None **
*
* IMPLICIT INPUTS:
*
* ** None **
*
* IMPLICIT OUTPUTS:
*
* ** None **
*
* FUNCTION VALUE:
*
* completion status
*
* SIDE EFFECTS:
*
* ** None **
*
*/
int
main( void )
{
int one = 1; /* reuseaddr option value */
struct iosb iosb; /* i/o status block */
unsigned int status; /* system service return status */
unsigned short conn_channel; /* connect inet device i/o channel */
unsigned short listen_channel; /* listen inet device i/o channel */
struct sockchar listen_sockchar; /* listen socket char buffer */
unsigned int client_retlen; /* returned length of client socket */
/* address structure */
struct sockaddr_in client_addr; /* client socket address structure */
struct itemlst_3 client_itemlst; /* client item-list 3 descriptor */
struct sockaddr_in serv_addr; /* server socket address structure */
struct itemlst_2 serv_itemlst; /* server item-list 2 descriptor */
struct itemlst_2 sockopt_itemlst; /* sockopt item-list 2 descriptor */
struct itemlst_2 reuseaddr_itemlst; /* reuseaddr item-list 2 element */
char buf[] = "Hello, World!"; /* server data buffer */
int buflen = sizeof( buf ); /* length of server data buffer */
$DESCRIPTOR( inet_device, /* string descriptor with logical */
"TCPIP$DEVICE" ); /* name of internet pseudodevice */
/*
* init listen socket characteristics buffer
*/
listen_sockchar.prot = TCPIP$C_TCP;
listen_sockchar.type = TCPIP$C_STREAM;
listen_sockchar.af = TCPIP$C_AF_INET;
/*
* init reuseaddr's item-list element
*/
reuseaddr_itemlst.length = sizeof( one );
reuseaddr_itemlst.type = TCPIP$C_REUSEADDR;
reuseaddr_itemlst.address = &one;
/*
* init sockopt's item-list descriptor
*/
sockopt_itemlst.length = sizeof( reuseaddr_itemlst );
sockopt_itemlst.type = TCPIP$C_SOCKOPT;
sockopt_itemlst.address = &reuseaddr_itemlst;
/*
* init client's item-list descriptor
*/
memset( &client_itemlst, 0, sizeof(client_itemlst) );
client_itemlst.length = sizeof( client_addr );
client_itemlst.address = &client_addr;
client_itemlst.retlen = &client_retlen;
/*
* init client's socket address structure
*/
memset( &client_addr, 0, sizeof(client_addr) );
/*
* init server's item-list descriptor
*/
serv_itemlst.length = sizeof( serv_addr );
serv_itemlst.type = TCPIP$C_SOCK_NAME;
serv_itemlst.address = &serv_addr;
/*
* init server's socket address structure
*/
memset( &serv_addr, 0, sizeof(serv_addr) );
serv_addr.sin_family = TCPIP$C_AF_INET;
serv_addr.sin_port = htons( SERV_PORTNUM );
serv_addr.sin_addr.s_addr = TCPIP$C_INADDR_ANY;
/*
* assign device sockets
*/
status = sys$assign( &inet_device, /* device name */
&listen_channel, /* i/o channel */
0, /* access mode */
0 /* not used */
);
if ( (status & STS$M_SUCCESS) )
status = sys$assign( &inet_device, /* device name */
&conn_channel, /* i/o channel */
0, /* access mode */
0 /* not used */
);
if ( !(status & STS$M_SUCCESS) )
{
printf( "Failed to assign i/o channel(s) to TCPIP device\n" );
exit( status );
}
/*
* create a listen socket
*/
status = sys$qiow( EFN$C_ENF, /* event flag */
listen_channel, /* i/o channel */
IO$_SETMODE, /* i/o function code */
&iosb, /* i/o status block */
0, /* ast service routine */
0, /* ast parameter */
&listen_sockchar, /* p1 - socket char buffer */
0, /* p2 */
0, /* p3 */
0, /* p4 */
&sockopt_itemlst, /* p5 - socket options */
0 /* p6 */
);
if ( status & STS$M_SUCCESS )
status = iosb.status;
if ( !(status & STS$M_SUCCESS) )
{
printf( "Failed to create socket\n" );
exit( status );
}
/*
* bind server's internet address and port number to
* listen socket; set socket as a passive socket
*/
status = sys$qiow( EFN$C_ENF, /* event flag */
listen_channel, /* i/o channel */
IO$_SETMODE, /* i/o function code */
&iosb, /* i/o status block */
0, /* ast service routine */
0, /* ast parameter */
0, /* p1 */
0, /* p2 */
&serv_itemlst, /* p3 - local socket name */
SERV_BACKLOG, /* p4 - connection backlog */
0, /* p5 */
0 /* p6 */
);
if ( status & STS$M_SUCCESS )
status = iosb.status;
if ( !(status & STS$M_SUCCESS) )
{
printf( "Failed to bind socket\n" );
exit( status );
}
/*
* accept a connection from a client
*/
printf( "Waiting for a client connection on port: %d\n",
ntohs(serv_addr.sin_port)
);
status = sys$qiow( EFN$C_ENF, /* event flag */
listen_channel, /* i/o channel */
IO$_ACCESS|IO$M_ACCEPT,
/* i/o function code */
&iosb, /* i/o status block */
0, /* ast service routine */
0, /* ast parameter */
0, /* p1 */
0, /* p2 */
&client_itemlst, /* p3 - remote socket name */
&conn_channel, /* p4 - i/o channel for new */
/* connection */
0, /* p5 */
0 /* p6 */
);
if ( status & STS$M_SUCCESS )
status = iosb.status;
if ( !(status & STS$M_SUCCESS) )
{
printf( "Failed to accept client connection\n" );
exit( status );
}
printf( "Accepted connection from host: %s, port: %d\n",
inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)
);
/*
* connection established with a client;
* now attempt to write on this connection
*/
status = sys$qiow( EFN$C_ENF, /* event flag */
conn_channel, /* i/o channel */
IO$_WRITEVBLK, /* i/o function code */
&iosb, /* i/o status block */
0, /* ast service routine */
0, /* ast parameter */
buf, /* p1 - buffer address */
buflen, /* p2 - buffer length */
0, /* p3 */
0, /* p4 */
0, /* p5 */
0 /* p6 */
);
if ( status & STS$M_SUCCESS )
status = iosb.status;
if ( !(status & STS$M_SUCCESS) )
{
printf( "Failed to write data to client connection\n" );
exit( status );
}
printf( "Data sent: %s\n", buf ); /* output server's data buffer */
/*
* shutdown connection socket
*/
status = sys$qiow( EFN$C_ENF, /* event flag */
conn_channel, /* i/o channel */
IO$_DEACCESS|IO$M_SHUTDOWN,
/* i/o function code */
&iosb, /* i/o status block */
0, /* ast service routine */
0, /* ast parameter */
0, /* p1 */
0, /* p2 */
0, /* p3 */
TCPIP$C_DSC_ALL, /* p4 - discard all packets */
0, /* p5 */
0 /* p6 */
);
if ( status & STS$M_SUCCESS )
status = iosb.status;
if ( !(status & STS$M_SUCCESS) )
{
printf( "Failed to shutdown client connection\n" );
exit( status );
}
/*
* close connection socket
*/
status = sys$qiow( EFN$C_ENF, /* event flag */
conn_channel, /* i/o channel */
IO$_DEACCESS, /* i/o function code */
&iosb, /* i/o status block */
0, /* ast service routine */
0, /* ast parameter */
0, /* p1 */
0, /* p2 */
0, /* p3 */
0, /* p4 */
0, /* p5 */
0 /* p6 */
);
if ( status & STS$M_SUCCESS )
status = iosb.status;
if ( !(status & STS$M_SUCCESS) )
{
printf( "Failed to close socket\n" );
exit( status );
}
/*
* close listen socket
*/
status = sys$qiow( EFN$C_ENF, /* event flag */
listen_channel, /* i/o channel */
IO$_DEACCESS, /* i/o function code */
&iosb, /* i/o status block */
0, /* ast service routine */
0, /* ast parameter */
0, /* p1 */
0, /* p2 */
0, /* p3 */
0, /* p4 */
0, /* p5 */
0 /* p6 */
);
if ( status & STS$M_SUCCESS )
status = iosb.status;
if ( !(status & STS$M_SUCCESS) )
{
printf( "Failed to close socket\n" );
exit( status );
}
/*
* deassign all device sockets
*/
status = sys$dassgn( conn_channel );
if ( (status & STS$M_SUCCESS) )
status = sys$dassgn( listen_channel );
if ( !(status & STS$M_SUCCESS) )
{
printf( "Failed to deassign i/o channel(s) to TCPIP device\n" );
exit( status );
}
exit( EXIT_SUCCESS );
}
|
E.2.3 TCP Server Accepting a Connection from the Auxiliary Server
Example E-6 shows how a typical TCP/IP IPv4 server uses $QIO system
services to handle network I/O operations and the server accepts
connections from the auxiliary server.
Example E-6 TCP Auxiliary Server (System
Services) |
#pragma module tcpip$tcp_server_qio_auxs \
"V5.1-00"
/*
* Copyright 2000 Compaq Computer Corporation
*
* COMPAQ Registered in U.S. Patent and Trademark Office.
*
* Confidential computer software. Valid license from Compaq
* or authorized sublicensor required for possession, use or
* copying. Consistent with FAR 12.211 and 12.212, Commercial
* Computer Software, Computer Software Documentation, and
* Technical Data for Commercial Items are licensed to the
* U.S. Government under vendor's standard commercial license.
*
* ++
* FACILITY:
*
* EXAMPLES
*
* ABSTRACT:
*
* This is an example of a TCP/IP IPv4 server using OpenVMS
* QIO system services to handle network I/O operations. In
* addition, it shows how to accept connections from the
* auxiliary server.
*
* Refer to 'Build, Configuration, and Run Instructions' for
* details on how to build, configure, and run this program.
*
* ENVIRONMENT:
*
* OpenVMS Alpha/VAX V7.1
* TCP/IP Services V5.0 or higher
*
* AUTHOR:
*
* TCPIP Development Group, CREATION DATE: 23-May-1989
*
* --
*/
/* Build, Configuration, and Run Instructions */
/*
* BUILD INSTRUCTIONS:
*
* To build this example program use commands of the form,
*
* using the DEC "C" compiler:
*
* $ cc/prefix=all TCPIP$TCP_SERVER_QIO_AUXS.C
* $ link TCPIP$TCP_SERVER_QIO_AUXS
*
* using the DEC "C++" compiler:
*
* $ cxx/prefix=all/define=VMS TCPIP$TCP_SERVER_QIO_AUXS.C
* $ link TCPIP$TCP_SERVER_QIO_AUXS
*
*
* CONFIGURATION INSTRUCTIONS:
*
* To configure this example program:
*
* 1) Create a service run command procedure, named HELLO_RUN.COM, that
* contains the following lines:
*
* $ define sys$output ddcu:[directory]hello_service.log
* $ define sys$error ddcu:[directory]hello_service.log
* $ run ddcu:[directory]tcpip$tcp_server_qio_auxs.exe
*
* where: ddcu:[directory] is the device and directory of where the
* hello service run command procedure file resides
*
* 2) Create a service database entry for the hello service as shown below:
*
* $ tcpip set service hello -
* _$ /port=12345 -
* _$ /protocol=tcp -
* _$ /user=vms_user_account -
* _$ /process_name=hello_world -
* _$ /file=ddcu:[directory]hello_run.com
*
* 3) Enable the hello service to run as shown below:
*
* $ tcpip enable service hello
*
*
* RUN INSTRUCTIONS:
*
* To run this example program:
*
* 1) Start the client program, entering the server host as shown below:
*
* $ run tcpip$tcp_client_sock
* Enter remote host:
*
* Note: You can specify a server host by using either an IPv4
* address in dotted-decimal notation (e.g. 16.20.10.56)
* or a host domain name (e.g. serverhost.compaq.com).
*
* 2) The auxiliary server receives the hello service request, creates a
* process, then executes the commands in hello_run.com to run this
* server program. This server program then logs client connection
* information and client data to the service log before replying to
* the client host with a message of "Hello, world!".
*
*/
/*
* INCLUDE FILES:
*/
#include <descrip.h> /* define OpenVMS descriptors */
#include <efndef.h> /* define 'EFN$C_ENF' event flag */
#include <in.h> /* define internet related constants, */
/* functions, and structures */
#include <inet.h> /* define network address info */
#include <iodef.h> /* define i/o function codes */
#include <ssdef.h> /* define system service status codes */
#include <starlet.h> /* define system service calls */
#include <stdio.h> /* define standard i/o functions */
#include <stdlib.h> /* define standard library functions */
#include <string.h> /* define string handling functions */
#include <stsdef.h> /* define condition value fields */
#include <tcpip$inetdef.h> /* define tcp/ip network constants, */
/* structures, and functions */
* STRUCTURE DEFINITIONS:
*/
struct iosb
{ /* i/o status block */
unsigned short status; /* i/o completion status */
unsigned short bytcnt; /* bytes transferred if read/write */
void *details; /* address of buffer or parameter */
};
struct itemlst_2
{ /* item-list 2 descriptor/element */
unsigned short length; /* length */
unsigned short type; /* parameter type */
void *address; /* address of item list */
};
struct itemlst_3
{ /* item-list 3 descriptor/element */
unsigned short length; /* length */
unsigned short type; /* parameter type */
void *address; /* address of item list */
unsigned int *retlen; /* address of returned length */
};
struct sockchar
{ /* socket characteristics buffer */
unsigned short prot; /* protocol */
unsigned char type; /* type */
unsigned char af; /* address format */
};
/*
* FORWARD REFERENCES:
*/
int main( void ); /* server main */
/* Server Main */
/*
* FUNCTIONAL DESCRIPTION:
*
* This is the server's main-line code. It handles all the tasks of the
* server including: socket creation, writing client connection data,
* and terminating client connections.
*
* This example program implements a typical TCP IPv4 server using QIO
* system services to handle network i/o operations. In addition, it
* uses the auxiliary server to accept client connections.
*
* 1) To create a socket:
*
* sys$assign() and sys$qiow(IO$_SETMODE)
*
* 2) To transfer data:
*
* sys$qiow(IO$_WRITEVBLK)
*
* 3) To close and delete a socket:
*
* sys$qiow(IO$_DEACCESS) and sys$dassgn()
*
* This function is invoked by the DCL "RUN" command (see below); the
* function's completion status is interpreted by DCL and if needed,
* an error message is displayed.
*
* SYNOPSIS:
*
* int main( void )
*
* FORMAL PARAMETERS:
*
* ** None **
*
* IMPLICIT INPUTS:
*
* ** None **
*
* IMPLICIT OUTPUTS:
*
* ** None **
*
* FUNCTION VALUE:
*
* completion status
*
* SIDE EFFECTS:
*
* ** None **
*
*/
int
main( void )
{
struct iosb iosb; /* i/o status block */
unsigned int status; /* system service return status */
unsigned short conn_channel; /* connect inet device i/o channel */
struct sockchar conn_sockchar; /* connect socket char buffer */
unsigned int client_retlen; /* returned length of client socket */
/* address structure */
struct sockaddr_in client_addr; /* client socket address structure */
struct itemlst_3 client_itemlst; /* client item-list 3 descriptor */
char buf[] = "Hello, world!"; /* server data buffer */
int buflen = sizeof( buf ); /* length of server data buffer */
$DESCRIPTOR( inet_device, /* string descriptor with logical */
"SYS$NET" ); /* name of internet pseudodevice */
/*
* init connection socket characteristics buffer
*/
conn_sockchar.prot = TCPIP$C_TCP;
conn_sockchar.type = TCPIP$C_STREAM;
conn_sockchar.af = TCPIP$C_AUXS;
/*
* init client's item-list descriptor
*/
memset( &client_itemlst, 0, sizeof(client_itemlst) );
client_itemlst.length = sizeof( client_addr );
client_itemlst.address = &client_addr;
client_itemlst.retlen = &client_retlen;
/*
* init client's socket address structure
*/
memset( &client_addr, 0, sizeof(client_addr) );
/*
* assign device socket
*/
status = sys$assign( &inet_device, /* device name */
&conn_channel, /* i/o channel */
0, /* access mode */
0 /* not used */
);
if ( !(status & STS$M_SUCCESS) )
{
printf( "Failed to assign i/o channel to TCPIP device\n" );
exit( status );
}
/*
* create connection socket
*/
status = sys$qiow( EFN$C_ENF, /* event flag */
conn_channel, /* i/o channel */
IO$_SETMODE, /* i/o function code */
&iosb, /* i/o status block */
0, /* ast service routine */
0, /* ast parameter */
&conn_sockchar, /* p1 - socket char buffer */
0, /* p2 */
0, /* p3 */
0, /* p4 */
0, /* p5 */
0 /* p6 */
);
if ( status & STS$M_SUCCESS )
status = iosb.status;
if ( !(status & STS$M_SUCCESS) )
{
printf( "Failed to create socket\n" );
exit( status );
}
/*
* log this client connection
*/
status = sys$qiow( EFN$C_ENF, /* event flag */
conn_channel, /* i/o channel */
IO$_SENSEMODE, /* i/o function code */
&iosb, /* i/o status block */
0, /* ast service routine */
0, /* ast parameter */
0, /* p1 */
0, /* p2 */
0, /* p3 */
&client_itemlst, /* p4 - peer socket name */
0, /* p5 */
0 /* p6 */
);
if ( status & STS$M_SUCCESS )
status = iosb.status;
if ( !(status & STS$M_SUCCESS) )
{
printf( "Failed to accept client connection\n" );
exit( status );
}
printf( "Accepted connection from host: %s, port: %d\n",
inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)
);
/*
* connection established with a client;
* now attempt to write on this connection
*/
status = sys$qiow( EFN$C_ENF, /* event flag */
conn_channel, /* i/o channel */
IO$_WRITEVBLK, /* i/o function code */
&iosb, /* i/o status block */
0, /* ast service routine */
0, /* ast parameter */
buf, /* p1 - buffer address */
buflen, /* p2 - buffer length */
0, /* p3 */
0, /* p4 */
0, /* p5 */
0 /* p6 */
);
if ( status & STS$M_SUCCESS )
status = iosb.status;
if ( !(status & STS$M_SUCCESS) )
{
printf( "Failed to write data to client connection\n" );
exit( status );
}
printf( "Data sent: %s\n", buf ); /* output server's data buffer */
/*
* close connection socket
*/
status = sys$qiow( EFN$C_ENF, /* event flag */
conn_channel, /* i/o channel */
IO$_DEACCESS, /* i/o function code */
&iosb, /* i/o status block */
0, /* ast service routine */
0, /* ast parameter */
0, /* p1 */
0, /* p2 */
0, /* p3 */
TCPIP$C_DSC_ALL, /* p4 - discard all packets */
0, /* p5 */
0 /* p6 */
);
if ( status & STS$M_SUCCESS )
status = iosb.status;
if ( !(status & STS$M_SUCCESS) )
{
printf( "Failed to close socket\n" );
exit( status );
}
/*
* deassign device socket
*/
status = sys$dassgn( conn_channel );
if ( !(status & STS$M_SUCCESS) )
{
printf( "Failed to deassign i/o channel to TCPIP device\n" );
exit( status );
}
exit( EXIT_SUCCESS );
}
|
|