HP OpenVMS Systems Documentation |
HP TCP/IP Services for OpenVMS
|
| Previous | Contents | Index |
If your application uses IPv4 IP-level socket options, change them to
the corresponding IPv6 options.
E.6 Sample Client/Server Programs
This section contains sample client and server programs that demonstrate the differences between IPv4 and IPv6 coding conventions:
To build the examples, use the following commands:
$ CC/DEFINE=(_SOCKADDR_LEN)/INCLUDE=TCPIP$EXAMPLES: client.c $ LINK client, TCPIP$LIBRARY:TCPIP$LIB/LIBRARY $ CC/DEFINE=(_SOCKADDR_LEN)/INCLUDE=TCPIP$EXAMPLES: server.c $ LINK server, TCPIP$LIBRARY:TCPIP$LIB/LIBRARY |
This section contains a client and a server program that use AF_INET
sockets.
E.6.1.1 Client Program
The following is a sample client program that you can build, compile and run on your system. The program sends a request to and receives a response from the system specified on the command line.
#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 */
#define BUFSZ 1024 /* user input buffer size */
#define SERV_PORTNUM 12345 /* server port number */
int main( void ); /* client main */
void get_serv_addr( void * );(1) /* get server host address */
int
main( void )
{
int sockfd; /* connection socket descriptor */
char buf[512]; /* client data buffer */
struct sockaddr_in serv_addr;(2) /* server socket address structure */
memset( &serv_addr, 0, sizeof(serv_addr) );(3)
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons( SERV_PORTNUM );
get_serv_addr( &serv_addr.sin_addr );(4)
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 )(5)
{
perror( "Failed to create socket" );
exit( EXIT_FAILURE );
}
printf( "Initiated connection to host: %s, port: %d\n",
inet_ntoa(serv_addr.sin_addr), ntohs(serv_addr.sin_port)(6)
);
if ( connect(sockfd,
(struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0 )(7)
{
perror( "Failed to connect to server" );
exit( EXIT_FAILURE );
}
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 */
if ( shutdown(sockfd, 2) < 0 )
{
perror( "Failed to shutdown server connection" );
exit( EXIT_FAILURE );
}
if ( close(sockfd) < 0 )
{
perror( "Failed to close socket" );
exit( EXIT_FAILURE );
}
exit( EXIT_SUCCESS );
}
void
get_serv_addr( void *addrptr )(8)
{
char buf[BUFSZ]; /* input data buffer */
struct in_addr val; /* remote host address structure */
struct hostent *host; /* remote host hostent structure */
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)) )(9)
{
memcpy( addrptr, host->h_addr, sizeof(struct in_addr) );
break;
}
}
}
|
This example of a client applications sends a request and receives a response on an AF_INET socket.
The following is a sample server program that you can build, compile, and run on your system. The program receives requests from and sends responses to client programs on other systems.
#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 */
#define SERV_BACKLOG 1 /* server backlog */
#define SERV_PORTNUM 12345 /* server port number */
int main( void ); /* server main */
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;(1) /* client socket address structure */
struct sockaddr_in serv_addr; /* server socket address structure */
struct hostent *host;(2) /* host name structure */
char buf[] = "Hello, world!"; /* server data buffer */
memset( &client_addr, 0, sizeof(client_addr) );
memset( &serv_addr, 0, sizeof(serv_addr) );(3)
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons( SERV_PORTNUM );
serv_addr.sin_addr.s_addr = INADDR_ANY;
if ( (listen_sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 )(4)
{
perror( "Failed to create socket" );
exit( EXIT_FAILURE );
}
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 );
}
if ( listen(listen_sockfd, SERV_BACKLOG) < 0 )
{
perror( "Failed to set socket passive" );
exit( EXIT_FAILURE );
}
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 );
}
host = gethostbyaddr( (char *)&client_addr.sin_addr.s_addr,
sizeof(client_addr.sin_addr.s_addr), AF_INET (5)
);
if ( host == NULL )
{
perror( "Failed to translate client address\n" );
exit( EXIT_FAILURE );
}
printf( "Accepted connection from host: %s (%s), port: %d\n",
host->h_name, inet_ntoa(client_addr.sin_addr),
ntohs(client_addr.sin_port)
);
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 */
if ( shutdown(conn_sockfd, 2) < 0 )
{
perror( "Failed to shutdown client connection" );
exit( EXIT_FAILURE );
}
if ( close(conn_sockfd) < 0 )
{
perror( "Failed to close socket" );
exit( EXIT_FAILURE );
}
if ( close(listen_sockfd) < 0 )
{
perror( "Failed to close socket" );
exit( EXIT_FAILURE );
}
exit( EXIT_SUCCESS );
}
|
This example of a server application sends a request and receives a response on an AF_INET socket.
This section contains a client and a server program that use AF_INET6
sockets.
E.6.2.1 Client Program
The following is a sample client program that you can build, compile, and run on your system. The program sends a request to and receives a response from the system specified on the command line.
#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 */
#define BUFSZ 1024 /* user input buffer size */
#define SERV_PORTNUM "12345" /* server port number string */
int main( void ); /* client main */
void get_serv_addr( struct addrinfo *hints, struct addrinfo **res );(1)
/* get server host address */
int
main( void )
{
int sockfd; /* connection socket descriptor */
char buf[512]; /* client data buffer */
struct addrinfo hints; /* input values to direct operation */
struct addrinfo *res;(2) /* linked list of addrinfo structs */
memset( &hints, 0, sizeof(hints) );(3)
hints.ai_family = AF_INET6;
hints.ai_flags = AI_ADDRCONFIG | AI_V4MAPPED | AI_CANONNAME;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_socktype = SOCK_STREAM;
get_serv_addr( &hints, &res );(4)
if ( (sockfd = socket(AF_INET6, SOCK_STREAM, 0)) < 0 )(5)
{
perror( "Failed to create socket" );
exit( EXIT_FAILURE );
}
printf( "Initiated connection to host: %s, port: %d\n",
res->ai_canonname,
htons(((struct sockaddr_in6 *)res->ai_addr)->sin6_port)(6) );
if ( connect(sockfd, res->ai_addr, res->ai_addrlen) < 0 )(7)
{
perror( "Failed to connect to server" );
exit( EXIT_FAILURE );
}
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 */
if ( shutdown(sockfd, 2) < 0 )
{
perror( "Failed to shutdown server connection" );
exit( EXIT_FAILURE );
}
if ( close(sockfd) < 0 )
{
perror( "Failed to close socket" );
exit( EXIT_FAILURE );
}
exit( EXIT_SUCCESS );
}
void
get_serv_addr( struct addrinfo *hints, struct addrinfo **res )(8)
{
int gai_error; /* return value of getaddrinfo() */
char buf[BUFSZ]; /* input data buffer */
const char *port = SERV_PORTNUM; /* server port number */
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;
gai_error = getaddrinfo( buf, port, hints, res );(9)
if ( gai_error )
printf( "Failed to resolve name or address: %s\n",
gai_strerror(gai_error)(10)
);
else
break;
}
}
|
This example of a client application sends a request and receives a response on an AF_INET6 socket.
The following is a sample server program that you can build, compile, and run on your system. The program receives requests from and sends responses to client programs on other systems.
#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 */
#define SERV_BACKLOG 1 /* server backlog */
#define SERV_PORTNUM 12345 /* server port number */
int main( void ); /* server main */
int
main( void )
{
int optval = 1; /* SO_REUSEADDR'S option value (on) */
int conn_sockfd; /* connection socket descriptor */
int listen_sockfd; /* listen socket descriptor */
int gni_error;(1) /* return status for getnameinfo() */
unsigned int client_addrlen; /* returned length of client socket */
/* address structure */
struct sockaddr_in6 client_addr; /* client socket address structure */
struct sockaddr_in6 serv_addr;(2) /* server socket address structure */
char buf[] = "Hello, world!"; /* server data buffer */
char node[NI_MAXHOST];(3) /* buffer to receive node name */
char port[NI_MAXHOST]; /* buffer to receive port number */
char addrbuf[INET6_ADDRSTRLEN]; /* buffer to receive host's address */
memset( &client_addr, 0, sizeof(client_addr) );
memset( &serv_addr, 0, sizeof(serv_addr) );(4)
serv_addr.sin6_family = AF_INET6;
serv_addr.sin6_port = htons( SERV_PORTNUM );
serv_addr.sin6_addr = in6addr_any;
if ( (listen_sockfd = socket(AF_INET6, SOCK_STREAM, 0)) < 0 )(5)
{
perror( "Failed to create socket" );
exit( EXIT_FAILURE );
}
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 );
}
if ( listen(listen_sockfd, SERV_BACKLOG) < 0 )
{
perror( "Failed to set socket passive" );
exit( EXIT_FAILURE );
}
printf( "Waiting for a client connection on port: %d\n",
ntohs(serv_addr.sin6_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 );
}
gni_error = getnameinfo( (struct sockaddr *)&client_addr,client_addrlen, (6)
node, sizeof(node), NULL, 0, NI_NAMEREQD
);
if ( gni_error )
{
printf( "Failed to translate client address: %s\n",
gai_strerror(gni_error) (7)
);
exit( EXIT_FAILURE );
}
gni_error = getnameinfo( (struct sockaddr *)&client_addr, client_addrlen,
addrbuf, sizeof(addrbuf), port, sizeof(port),
NI_NUMERICHOST | NI_NUMERICSERV (8)
);
if ( gni_error )
{
printf( "Failed to translate client address and/or port: %s\n",
gai_strerror(gni_error)
);
exit( EXIT_FAILURE );
}
printf( "Accepted connection from host: %s (%s), port: %s\n",
node, addrbuf, port
);
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 */
if ( shutdown(conn_sockfd, 2) < 0 )
{
perror( "Failed to shutdown client connection" );
exit( EXIT_FAILURE );
}
if ( close(conn_sockfd) < 0 )
{
perror( "Failed to close socket" );
exit( EXIT_FAILURE );
}
if ( close(listen_sockfd) < 0 )
{
perror( "Failed to close socket" );
exit( EXIT_FAILURE );
}
exit( EXIT_SUCCESS );
}
|
This example of a server application sends a request and receives a response on an AF_INET6 socket.
This section contains sample output from the preceding server and client programs. The server program makes and receives all requests on an AF_INET6 socket using sockaddr_in6 . For requests received over IPv4, sockaddr_in6 contains an IPv4-mapped IPv6 address.
$ run client.exe Enter remote host: hosta6 Initiated connection to host: hosta6.ipv6.corp.example, port: 12345 Data received: Hello, world! $ |
$ run server.exe Waiting for a client connection on port: 12345 Accepted connection from host: hostb6.ipv6.corp.example (3ffe:1200::a00:2bff:fe97:7be0), port: 49174 Data sent: Hello, world! $ |
$ run client.exe Enter remote host: hosta Initiated connection to host: hosta.corp.example, port 12345 Data received: Hello, world! $ |
$ run server.exe Waiting for a client connection on port: 12345 Accepted connection from host: hostb.corp.example (::ffff:10.10.10.251), port: 49175 Data sent: Hello, world! $ |
$ run client.exe Enter remote host: fe80::a00:2bff:fe97:7be0 Initiated connection to host: fe80::a00:2bff:fe97:7be0, port: 12345 Data received: Hello, world! $ |
$ run server.exe Waiting for a client connection on port: 12345 Accepted connection from host: hosta6.ipv6.corp.example%WE0 (fe80::a00:2bff:fe97:7be0%WE0), port: 49177 Data sent: Hello, world! $ |
| Index | Contents |