The following example shows a C socket TCP server (TCPS)
program. The source code can be found in the TCPS member of the SEZAINST
data set.
/*** IBMCOPYR ********************************************************/
/* */
/* Component Name: TCPS */
/* */
/* */
/* Copyright: Licensed Materials - Property of IBM */
/* */
/* "Restricted Materials of IBM" */
/* */
/* 5647-A01 */
/* */
/* (C) Copyright IBM Corp. 1977, 1998 */
/* */
/* US Government Users Restricted Rights - */
/* Use, duplication or disclosure restricted by */
/* GSA ADP Schedule Contract with IBM Corp. */
/* */
/* Status: CSV2R6 */
/* */
/* SMP/E Distribution Name: EZAEC01X */
/* */
/*** IBMCOPYR ********************************************************/
static char ibmcopyr[] =
"TCPS - Licensed Materials - Property of IBM. "
"This module is \"Restricted Materials of IBM\" "
"5647-A01 (C) Copyright IBM Corp. 1996. "
"See IBM Copyright Instructions.";
#include <manifest.h>
#include <bsdtypes.h>
#include <socket.h>
#include <in.h>
#include <netdb.h>
#include <stdio.h>
/*
* Server Main.
*/
main(argc, argv)
int argc;
char **argv;
{
unsigned short port; /* port server binds to */
char buf[12]; /* buffer for sending & receiving data */
struct sockaddr_in client; /* client address information */
struct sockaddr_in server; /* server address information */
int s; /* socket for accepting connections */
int ns; /* socket connected to client */
int namelen; /* length of client name */
/*
* Check arguments. Should be only one: the port number to bind to.
*/
if (argc != 2)
{
fprintf(stderr, "Usage: %s port\n", argv[0]);
exit(1);
}
/*
* First argument should be the port.
*/
port = (unsigned short) atoi(argv[1]);
/*
* Get a socket for accepting connections.
*/
if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
tcperror("Socket()");
exit(2);
}
/*
* Bind the socket to the server address.
*/
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = INADDR_ANY;
if (bind(s, (struct sockaddr *)&server, sizeof(server)) < 0)
{
tcperror("Bind()");
exit(3);
}
/*
* Listen for connections. Specify the backlog as 1.
*/
if (listen(s, 1) != 0)
{
tcperror("Listen()");
exit(4);
}
/*
* Accept a connection.
*/
namelen = sizeof(client);
if ((ns = accept(s, (struct sockaddr *)&client, &namelen)) == -1)
{
tcperror("Accept()");
exit(5);
}
/*
* Receive the message on the newly connected socket.
*/
if (recv(ns, buf, sizeof(buf), 0) == -1)
{
tcperror("Recv()");
exit(6);
}
/*
* Send the message back to the client.
*/
if (send(ns, buf, sizeof(buf), 0) < 0)
{
tcperror("Send()");
exit(7);
}
close(ns);
close(s);
printf("Server ended successfully\n");
exit(0);
}
Figure 1. C socket
TCP server sample