|
/* ---------------------------
1. Create a TCP socket
--------------------------- */
s1 = socket(AF_INET, SOCK_STREAM, 0);
....
/* ------------------------------------------------------------
2. Bind socekt to a IP network address (IP addr, TCP port#)
so that the socket can be identified
----------------------------------------------------------- */
if ( bind(s1, (struct sockaddr *) &server, sizeof(server) ) < 0 )
{ perror("bind:");
exit(1);
}
/* -------------------------------------------------------------
3. Change socket into a listen socket
A listen socket run the TCP connection establishment protocol
that starts a "sliding window session"
------------------------------------------------------------- */
listen(s1, 5);
/* ====================================================
We want to keep the server running forever...
That's why we use a while-loop...
==================================================== */
while (1)
{
len = sizeof(from);
/* ---------------------------------------------------------
4. Make the server program wait for a connection request
from a client
--------------------------------------------------------- */
if ( (s2 = accept(s1, (struct sockaddr *) &from, &len)) < 0 )
{
perror("accept: ");
exit(1);
}
// A serial server will continue execution here without creating a new process
/* ----------------------------------------------
Server program use socket s2 to
commninicate with the client
---------------------------------------------- */
/* --------------------------- ---+
Processing loop |
--------------------------- */ |
while ( read( s2, buf, .... ) > 0 ) | Change this loop
{ | for different kinds
process data in buf | of services
write(s2, reply, ...); // Send reply back |
} ---+
close(s2); // Close socket when done
// We NOW loop back up and
// accept the next connection request
}
|
/* -------------------------------
Processing loop
------------------------------- */
while (read(s2, &c, 1) > 0) // Receive 1 character
{
putchar(c); // Print it
fflush(stdout);
}
close(s2);
|
main(int argc, char *argv[])
{
int s1; /* s1 = listen socket */
int s2; /* s2 = connect socket */
struct sockaddr_in me; /* My own Internet address */
struct sockaddr_in myname; /* Used to retrieve my TCP port */
int myname_len;
struct sockaddr_in from; /* Internet address from client */
int len; /* length associated with `from' */
char c; /* Used to get data from connection */
if (argc == 1)
{ printf("Usage: %s port\n", argv[0]);
exit(1);
}
/* -----------------------------------------------
Create a TCP socket
------------------------------------------------ */
s1 = socket(AF_INET, SOCK_STREAM, 0);
/* ------------------------------------------------------------
Set up Internet address (IPaddr, Port#) to bind the socket
------------------------------------------------------------ */
me.sin_family = AF_INET; /* Put in the family */
me.sin_port = htons(atoi(argv[1])); /* Put in the port number */
me.sin_addr.s_addr = htonl(INADDR_ANY); /* Use wildcard address */
/* -------------------------------------------------
Make TCP socket "identifiable"
------------------------------------------------- */
if ( bind(s1, (struct sockaddr *) &me, sizeof(me) ) < 0)
{ perror("bind:");
exit(1);
}
/* ========================================
Change s1 into a "listen" socket
(with max 5 pending connection reqs)
======================================== */
listen(s1, 5);
/* ---------------------------------------
Keep the server running forever....
--------------------------------------- */
while (1)
{
len = sizeof(from);
/* ====================================================
Make the server program wait for a connection
from a client....
===================================================== */
if ( (s2 = accept(s1, (struct sockaddr *) &from, &len)) < 0)
{
perror("accept: ");
exit(1);
}
/* ==========================================
Use socket s2 to get data from client
and print it
========================================== */
while (read( s2 , &c, 1) > 0)
{
putchar(c); // Print each character read
fflush(stdout);
}
close( s2 );
printf("\n\n...Done...\n\n");
}
}
|
/* ==========================================================
The socket creation and connection to server
have been omitted for brevity
========================================================== */
char c;
while ((c = getchar()) != EOF ) // Read a character and store in c
{
write(s, &c, 1); // Send the character to server
}
|
How to run the program:
|
/* ==================================================
This is the processing loop of the server
================================================== */
int x, y, z;
while ( 1 )
{
int x1, y1, z1;
if ( read( s2, &x1, 4) <= 0 ) // An int is 4 bytes
break;
x = ntohl(x1); // Convert to host order
if ( read( s2, &y1, 4) <= 0 )
break;
y = ntohl(y1); // Convert to host order
z = x + y;
printf("Client data: %d, %d, send sum = %d\n", x, y, z);
z1 = htonl(z);
write ( s2, &z1, 4 );
}
close(s2);
|
/* ==========================================================
The socket creation and connection to server
have been omitted for brevity
========================================================== */
int x, y, z;
while ( 1 )
{
printf("Enter first number (0 to exit): ");
scanf("%d", &x); // Read first integer
if ( x == 0 )
{
close(s);
exit(0);
}
printf("Enter second number: ");
scanf("%d", &y); // Read second integer
int x1, y1, z1;
x1 = htonl(x); // Convert them to network byte order first
y1 = htonl(y);
write(s, &x1, 4); // Send the integers
write(s, &y1, 4);
/* ===================================
Receive the answer from the server
=================================== */
read(s, &z1, 4);
z = htonl(z1); // Convert answer to host byte order
printf("%d + %d = %d\n", x, y, z); // Print it
}
|
How to run the program:
|