#include #include #include #include #include #include #include #include #include #include #include #define SA struct sockaddr main(int argc, char **argv) { int sd, psd; struct sockaddr_in server; struct sockaddr_in from; int fromlen; int length; int pn; int childpid; int index = 0; server.sin_family = AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); server.sin_port = htons(0); sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (bind(sd, (SA *) & server, sizeof(server)) < 0) { close(sd); perror("binding name to stream socket"); exit(-1); } length = sizeof(server); if (getsockname(sd, (SA *) & server, &length)) { perror("getting socket name"); exit(0); } printf("Server Port is: %d\n\n", ntohs(server.sin_port)); listen(sd, 4); fromlen = sizeof(from); psd = accept(sd, (SA *) & from, &fromlen); close(sd); for (index = 1; index < 4; index++) { childpid = fork(); if (childpid == 0) EchoServe(psd, from, index); else printf("Process %d pid is %d\n", index, childpid); } wait(); } EchoServe(psd, from, id) int psd; struct sockaddr_in from; int id; { char buf[512]; int rc; for (;;) { if ((rc = recv(psd, buf, sizeof(buf), MSG_PEEK)) < 0) { perror("peeking stream message"); exit(-1); } if (rc > 0) { buf[rc] = NULL; printf("Process %d Peeked: %s", id, buf); if ((rc = recv(psd, buf, sizeof(buf), 0)) < 0) { perror("consume stream message"); exit(-1); } buf[rc] = NULL; printf(">> Process %d Consummed: %s\n", id, buf); if (send(psd, buf, rc, 0) < 0) perror("sending stream message"); } else { printf("Disconnected..\n"); exit(0); } } }