/* A simple echo server using TCP from Leon-Garcia and Widjaja's book "Communication Networks: Fundamental Concepts and Key Architectures," McGraw-Hill, 2000, pages 72 - 74. */ #include #include #include #include #define SERVER_TCP_PORT 3000 /* well known port */ #define BUFLEN 256 /* buffer length */ int main (int argc, char **argv) { int n, bytes_to_read; int sd, new_sd, client_len, port; struct sockaddr_in server, client; char *bp, buf[BUFLEN]; switch(argc) { case 1: port = SERVER_TCP_PORT; break; case 2: port = atoi(argv[1]); break; default: fprintf(stderr, "Usage: %s [port]\n", argv[0]); exit(1); } /* Create a stream socket (TCP, connection-oriented) */ if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { fprintf(stderr, "%s: Can't create a socket.\n", argv[0]); exit(1); } /* Bind an address to the socket */ bzero((char *)&server, sizeof(struct sockaddr_in)); server.sin_family = AF_INET; /* Internet connection */ server.sin_port = htons(port); /* Define the port # */ server.sin_addr.s_addr = htonl(INADDR_ANY); /* Use any server address */ if (bind(sd, (struct sockaddr *)&server, sizeof(server)) == -1) { fprintf(stderr, "%s: Can't bind name to socket.\n", argv[0]); exit(1); } /* Queue upt to five connect requests */ listen(sd, 5); while(1) { client_len = sizeof(client); if ((new_sd = accept(sd, (struct sockaddr *)&client, &client_len)) == -1) { fprintf(stderr, "%s: Can't accept client.\n", argv[0]); exit(1); } bp = buf; bytes_to_read = BUFLEN; while ((n = read(new_sd, bp, bytes_to_read)) > 0) { bp += n; bytes_to_read -= n; } printf("Received string = %s\n", buf); write(new_sd, buf, BUFLEN); /* echo the message */ close(new_sd); } close(sd); /* This statement is inaccessible! */ return(0); }