hp.com home products and services support and drivers solutions how to buy
cd-rom home
End of Jump to page title
HP OpenVMS systems
documentation

Jump to content


HP TCP/IP Services for OpenVMS

HP TCP/IP Services for OpenVMS
Sockets API and System Services Programming


Previous Contents Index


Appendix E
Programming Examples

Table E-1 lists the sample programs contained in this appendix and on line in the directory specified by the TCPIP$EXAMPLES system logical. See Table 1-4 and Table 1-5 for a complete list of all the sample programs provided on line in the TCPIP$EXAMPLES directory.

Table E-1 Client/Server Programming Examples
File Refer to...
TCPIP$TCP_CLIENT_SOCK.C Section E.1.1
TCPIP$TCP_SERVER_SOCK.C Section E.1.2
TCPIP$TCP_SERVER_SOCK_AUXS.C Section E.1.3
   
TCPIP$TCP_CLIENT_QIO.C Section E.2.1
TCPIP$TCP_SERVER_QIO.C Section E.2.2
TCPIP$TCP_SERVER_QIO_AUXS.C Section E.2.3
   
TCPIP$UDP_CLIENT_SOCK.C Section E.3.1
TCPIP$UDP_SERVER_SOCK.C Section E.3.2
   
TCPIP$UDP_CLIENT_QIO.C Section E.4.1
TCPIP$UDP_SERVER_QIO.C Section E.4.2

E.1 TCP Client/Server Examples (Sockets API)

This section contains examples that show the following:

E.1.1 TCP Client

Example E-1 shows how a typical TCP IPv4 client uses the Sockets API to handle the tasks of creating a socket, initiating server connections, reading service connection data, and then terminating the server connections.

Example E-1 TCP Client (Sockets API)

 
#pragma module  tcpip$tcp_client_sock                   \
                "V5.4-00" 
 
/* 
 * (c) Copyright 1976, 2003 Hewlett-Packard Development Company, L.P. 
 * 
 * Confidential computer software.  Valid license  from  HP  and/or its 
 * subsidiaries 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. 
 * 
 * Neither HP nor any of its subsidiaries shall be liable for technical 
 * or editorial errors or omissions contained herein.   The information 
 * in  this document is provided  "as is"  without warranty of any kind 
 * and is subject  to  change  without  notice.   The warranties for HP 
 * products are set forth in the express  limited  warranty statements 
 * accompanying such products.   Nothing herein should be construed as 
 * constituting an additional warranty. 
 * 
 * ++ 
 * FACILITY: 
 * 
 *    EXAMPLES 
 *      
 * ABSTRACT: 
 * 
 *    This is an example of a TCP/IP IPv4 client using  4.x BSD 
 *    socket  Application Programming Interface (API) 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_CLIENT_SOCK.C 
 *      $ link TCPIP$TCP_CLIENT_SOCK 
 *    
 *    using the DEC "C++" compiler: 
 *    
 *      $ cxx/prefix=all/define=VMS TCPIP$TCP_CLIENT_SOCK.C 
 *      $ link TCPIP$TCP_CLIENT_SOCK 
 * 
 * 
 * CONFIGURATION INSTRUCTIONS: 
 * 
 *    No special configuration required. 
 * 
 *    
 * RUN INSTRUCTIONS: 
 * 
 *    To run this example program: 
 * 
 *    1) Start the client's server program as shown below: 
 * 
 *       $ run tcpip$tcp_server_sock 
 *       Waiting for a client connection on port: m 
 * 
 *    2) After the server program blocks, start this 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). 
 * 
 *    3) The client program then displays server connection information 
 *       and server data as shown below: 
 * 
 *       Initiated connection to host: a.b.c.d, port: n 
 *       Data received: Hello, world! 
 * 
 *    You can enter "ctrl/z" at any user prompt to terminate program 
 *    execution. 
 * 
 */ 
 
/* 
 * INCLUDE FILES: 
 */ 
 
#include <in.h>                     /* define internet related constants,   */ 
                                    /* functions, and structures            */ 
#include <inet.h>                   /* define network address info          */ 
 
#include <netdb.h>                  /* define network database library info */ 
 
#include <socket.h>                 /* define BSD 4.x socket api            */ 
#include <stdio.h>                  /* define standard i/o functions        */ 
#include <stdlib.h>                 /* define standard library functions    */ 
#include <string.h>                 /* define string handling functions     */ 
 
#include <unixio.h>                 /* define unix i/o                      */ 
 
/* 
 * NAMED CONSTANTS: 
 */ 
 
#define BUFSZ           1024            /* user input buffer size           */ 
#define SERV_PORTNUM    12345           /* server port number               */ 
 
 
/* 
 * FORWARD REFERENCES: 
 */ 
 
int  main( void );                      /* client main                      */ 
void get_serv_addr( void * );           /* get server host address          */ 
 
        /* Client Main */ 
 
/* 
 * FUNCTIONAL DESCRIPTION: 
 * 
 *    This is the client's main-line code. It handles all the tasks of the 
 *    client including:  socket creation,  initiating server  connections, 
 *    reading server connection data, and terminating server connections. 
 * 
 *    This example program implements a typical TCP IPv4 client using  the 
 *    BSD socket API to handle network i/o operations as shown below: 
 * 
 *      1) To create a socket: 
 * 
 *         socket() 
 * 
 *      2) To initiate a connection: 
 * 
 *         connect() 
 * 
 *      3) To transfer data: 
 * 
 *         recv() 
 * 
 *      4) To shutdown a socket: 
 * 
 *         shutdown() 
 * 
 *      5) To close a socket: 
 * 
 *         close() 
 * 
 *    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 sockfd;                         /* connection socket descriptor     */ 
 
    char buf[512];                      /* client data buffer               */ 
 
    struct sockaddr_in serv_addr;       /* server socket address structure  */ 
 
    /* 
     * init server's socket address structure 
     */ 
 
    memset( &serv_addr, 0, sizeof(serv_addr) ); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_port   = htons( SERV_PORTNUM ); 
    get_serv_addr( &serv_addr.sin_addr ); 
 
    /* 
     * create connection socket 
     */ 
 
    if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) 
        { 
        perror( "Failed to create socket" ); 
        exit( EXIT_FAILURE ); 
        } 
 
    /* 
     * connect to specified host and port number 
     */ 
 
    printf( "Initiated connection to host: %s, port: %d\n", 
            inet_ntoa(serv_addr.sin_addr), ntohs(serv_addr.sin_port) 
          ); 
 
    if ( connect(sockfd, 
                 (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0 ) 
        { 
        perror( "Failed to connect to server" ); 
        exit( EXIT_FAILURE ); 
        } 
 
    /* 
     * connection established with a server; 
     * now attempt to read on this connection 
     */ 
 
    if ( recv(sockfd, buf, sizeof(buf), 0) < 0 ) 
        { 
        perror( "Failed to read data from server connection" ); 
        exit( EXIT_FAILURE ); 
        } 
 
    printf( "Data received: %s\n", buf );  /* output client's data buffer  */ 
 
    /* 
     * shutdown connection socket (both directions) 
     */ 
    if ( shutdown(sockfd, 2) < 0 ) 
        { 
        perror( "Failed to shutdown server connection" ); 
        exit( EXIT_FAILURE ); 
        } 
 
    /* 
     * close connection socket 
     */ 
 
    if ( close(sockfd) < 0 ) 
        { 
        perror( "Failed to close socket" ); 
        exit( EXIT_FAILURE ); 
        } 
 
    exit( EXIT_SUCCESS ); 
} 
 
        /* Get Server Host Address */ 
 
/* 
 * FUNCTIONAL DESCRIPTION: 
 * 
 *    This function gets the server host's address from the user and then 
 *    stores it in the server's socket address structure.  Note that  the 
 *    user can specify a server host by using either an IPv4  address  in 
 *    dotted-decimal notation (e.g. 16.20.10.126) or a host  domain  name 
 *    (e.g. serverhost.compaq.com). 
 * 
 *    Enter "ctrl/z" to terminate program execution. 
 * 
 * SYNOPSIS: 
 * 
 *    void get_serv_addr( void *addrptr ) 
 * 
 * FORMAL PARAMETERS: 
 * 
 *    addrptr  -  pointer to socket address structure's 'sin_addr' field 
 *                to store the specified network address 
 * 
 * IMPLICIT INPUTS: 
 * 
 *    ** None ** 
 * 
 * IMPLICIT OUTPUTS: 
 * 
 *    ** None ** 
 * 
 * FUNCTION VALUE: 
 * 
 *    ** None ** 
 * 
 * SIDE EFFECTS: 
 * 
 *    Program execution is terminated if unable to read user's input 
 * 
 */ 
void 
get_serv_addr( void *addrptr ) 
{ 
    char buf[BUFSZ]; 
    struct in_addr val; 
    struct hostent *host; 
 
    while ( TRUE ) 
        { 
        printf( "Enter remote host: " ); 
 
        if ( fgets(buf, sizeof(buf), stdin) == NULL ) 
            { 
            printf( "Failed to read User input\n" ); 
            exit( EXIT_FAILURE ); 
            } 
 
        buf[strlen(buf)-1] = 0; 
 
        val.s_addr = inet_addr( buf ); 
 
        if ( val.s_addr != INADDR_NONE ) 
            { 
            memcpy( addrptr, &val, sizeof(struct in_addr) ); 
            break; 
            } 
 
        if ( (host = gethostbyname(buf)) ) 
            { 
            memcpy( addrptr, host->h_addr, sizeof(struct in_addr) ); 
            break; 
            } 
        } 
} 

E.1.2 TCP Server

Example E-2 shows how a typical TCP IPv4 server uses the Sockets API to handle the tasks of creating a socket, accepting or rejecting client connections, writing client connection data, and then terminating client connections.

Example E-2 TCP Server (Sockets API)

 
#pragma module  tcpip$tcp_server_sock                   \
                "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  4.x BSD 
 *    socket Application Programming Interface (API) 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_SOCK.C 
 *      $ link TCPIP$TCP_SERVER_SOCK 
 *    
 *    using the DEC "C++" compiler: 
 *    
 *      $ cxx/prefix=all/define=VMS TCPIP$TCP_SERVER_SOCK.C 
 *      $ link TCPIP$TCP_SERVER_SOCK 
 * 
 * 
 * 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_sock 
 *       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_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). 
 * 
 *    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 <in.h>                     /* define internet related constants,   */ 
                                    /* functions, and structures            */ 
#include <inet.h>                   /* define network address info          */ 
 
#include <netdb.h>                  /* define network database library info */ 
 
#include <socket.h>                 /* define BSD 4.x socket api            */ 
#include <stdio.h>                  /* define standard i/o functions        */ 
#include <stdlib.h>                 /* define standard library functions    */ 
#include <string.h>                 /* define string handling functions     */ 
 
#include <unixio.h>                 /* define unix i/o                      */ 
 
/* 
 * NAMED CONSTANTS: 
 */ 
 
#define SERV_BACKLOG    1               /* server backlog                   */ 
#define SERV_PORTNUM    12345           /* server port number               */ 
 
 
/* 
 * 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  the 
 *    BSD socket API to handle network i/o operations as shown below: 
 * 
 *      1) To create a socket: 
 * 
 *         socket() 
 * 
 *      2) To set REUSEADDR socket option: 
 * 
 *         setsockopt() 
 * 
 *      3) To bind internet address and port number to a socket: 
 * 
 *         bind() 
 * 
 *      4) To set an active socket to a passive (listen) socket: 
 * 
 *         listen() 
 * 
 *      5) To accept a connection request: 
 * 
 *         accept() 
 * 
 *      6) To transfer data: 
 * 
 *         send() 
 * 
 *      7) To shutdown a socket (both directions): 
 * 
 *         shutdown() 
 * 
 *      8) To close a socket: 
 * 
 *         close() 
 * 
 *    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 optval = 1;                     /* SO_REUSEADDR'S option value (on) */ 
 
    int conn_sockfd;                    /* connection socket descriptor     */ 
    int listen_sockfd;                  /* listen socket descriptor         */ 
 
    unsigned int client_addrlen;        /* returned length of client socket */ 
                                        /* address structure                */ 
    struct sockaddr_in client_addr;     /* client socket address structure  */ 
    struct sockaddr_in serv_addr;       /* server socket address structure  */ 
 
    char buf[] = "Hello, World!";       /* server data buffer               */ 
 
    /* 
     * init client's socket address structure 
     */ 
 
    memset( &client_addr, 0, sizeof(client_addr) ); 
 
    /* 
     * init server's socket address structure 
     */ 
 
    memset( &serv_addr, 0, sizeof(serv_addr) ); 
    serv_addr.sin_family      = AF_INET; 
    serv_addr.sin_port        = htons( SERV_PORTNUM ); 
    serv_addr.sin_addr.s_addr = INADDR_ANY; 
 
    /* 
     * create a listen socket 
     */ 
 
    if ( (listen_sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) 
        { 
        perror( "Failed to create socket" ); 
        exit( EXIT_FAILURE ); 
        } 
 
    /* 
     * bind server's internet address and port number to listen socket 
     */ 
 
    if ( setsockopt(listen_sockfd, 
                    SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0 ) 
        { 
        perror( "Failed to set socket option" ); 
        exit( EXIT_FAILURE ); 
        } 
 
    if ( bind(listen_sockfd, 
              (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0 ) 
        { 
        perror( "Failed to bind socket" ); 
        exit( EXIT_FAILURE ); 
        } 
 
    /* 
     * set listen socket as a passive socket 
     */ 
 
    if ( listen(listen_sockfd, SERV_BACKLOG) < 0 ) 
        { 
        perror( "Failed to set socket passive" ); 
        exit( EXIT_FAILURE ); 
        } 
 
    /* 
     * accept connection from a client 
     */ 
 
    printf( "Waiting for a client connection on port: %d\n", 
            ntohs(serv_addr.sin_port) 
          ); 
 
    client_addrlen = sizeof(client_addr); 
 
    conn_sockfd = accept( listen_sockfd, 
                          (struct sockaddr *) &client_addr, 
                          &client_addrlen 
                        ); 
    if ( conn_sockfd < 0 ) 
        { 
        perror( "Failed to accept client connection" ); 
        exit( EXIT_FAILURE ); 
        } 
 
    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 
     */ 
 
    if ( send(conn_sockfd, buf, sizeof(buf), 0) < 0 ) 
        { 
        perror( "Failed to write data to client connection" ); 
        exit( EXIT_FAILURE ); 
        } 
 
    printf( "Data sent: %s\n", buf );      /* output server's data buffer  */ 
 
    /* 
     * shutdown connection socket (both directions) 
     */ 
 
    if ( shutdown(conn_sockfd, 2) < 0 ) 
        { 
        perror( "Failed to shutdown client connection" ); 
        exit( EXIT_FAILURE ); 
        } 
 
    /* 
     * close connection socket 
     */ 
 
    if ( close(conn_sockfd) < 0 ) 
        { 
        perror( "Failed to close socket" ); 
        exit( EXIT_FAILURE ); 
        } 
 
    /* 
     * close listen socket 
     */ 
 
    if ( close(listen_sockfd) < 0 ) 
        { 
        perror( "Failed to close socket" ); 
        exit( EXIT_FAILURE ); 
        } 
 
    exit( EXIT_SUCCESS ); 
} 

E.1.3 TCP Server Accepting a Connection from the Auxiliary Server

Example E-3 shows how a typical TCP/IP IPv4 server uses the BSD Version 4.x Sockets API to handle network I/O operations, and how the server accepts connections from the auxiliary server.

Example E-3 TCP Auxiliary Server (Sockets API)

 
#pragma module  tcpip$tcp_server_sock_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  4.x BSD 
 *    socket Application Programming Interface (API) 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_SOCK_AUXS.C 
 *      $ link TCPIP$TCP_SERVER_SOCK_AUXS 
 *    
 *    using the DEC "C++" compiler: 
 *    
 *      $ cxx/prefix=all/define=VMS TCPIP$TCP_SERVER_SOCK_AUXS.C 
 *      $ link TCPIP$TCP_SERVER_SOCK_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_sock_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 <in.h>                     /* define internet related constants,   */ 
                                    /* functions, and structures            */ 
#include <inet.h>                   /* define network address info          */ 
 
#include <socket.h>                 /* define BSD 4.x socket api            */ 
#include <stdio.h>                  /* define standard i/o functions        */ 
#include <stdlib.h>                 /* define standard library functions    */ 
#include <string.h>                 /* define string handling functions     */ 
 
#include <tcpip$inetdef.h>          /* define tcp/ip network constants,     */ 
                                    /* structures, and functions            */ 
 
#include <unixio.h>                 /* define unix i/o                      */ 
 
/* 
 * 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  the 
 *    BSD socket  API  to  handle network i/o operations.  In addition, it 
 *    uses the auxiliary server to accept client connections. 
 * 
 *      1) To create a socket: 
 * 
 *         socket() 
 * 
 *      2) To transfer data: 
 * 
 *         send() 
 * 
 *      3) To close a socket: 
 * 
 *         close() 
 * 
 *    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 sockfd;                         /* socket descriptor                */ 
 
    unsigned int client_addrlen;        /* returned length of client socket */ 
                                        /* address structure                */ 
    struct sockaddr_in client_addr;     /* client socket address structure  */ 
 
    char buf[] = "Hello, world!";       /* server data buffer               */ 
 
    /* 
     * init client's socket address structure 
     */ 
 
    memset( &client_addr, 0, sizeof(client_addr) ); 
 
    /* 
     * create socket 
     */ 
 
    if ( (sockfd = socket(TCPIP$C_AUXS, SOCK_STREAM, 0)) < 0 ) 
        { 
        perror( "Failed to create socket" ); 
        exit( EXIT_FAILURE ); 
        } 
 
    /* 
     * log this client connection 
     */ 
 
    client_addrlen = sizeof(client_addr); 
 
    if ( getpeername(sockfd, 
                     (struct sockaddr *) &client_addr, &client_addrlen) < 0 ) 
        { 
        perror( "Failed to accept client connection" ); 
        exit( EXIT_FAILURE ); 
        } 
 
    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 
     */ 
 
    if ( send(sockfd, buf, sizeof(buf), 0) < 0 ) 
        { 
        perror( "Failed to write data to client connection" ); 
        exit( EXIT_FAILURE ); 
        } 
 
    printf( "Data sent: %s\n", buf );      /* output server's data buffer  */ 
 
    /* 
     * close socket 
     */ 
 
    if ( close(sockfd) < 0 ) 
        { 
        perror( "Failed to close socket" ); 
        exit( EXIT_FAILURE ); 
        } 
 
    exit( EXIT_SUCCESS ); 
} 


Previous Next Contents Index