#pragma module tcpip$tcp_server_sock \ "V5.4-00" /* * © 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 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 "C" compiler: * * $ cc/prefix=all 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.hp.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 /* define internet related constants, */ /* functions, and structures */ #include /* define network address info */ #include /* define network database library info */ #include /* define BSD 4.x socket api */ #include /* define standard i/o functions */ #include /* define standard library functions */ #include /* define string handling functions */ #include /* 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 ); }