You are on page 1of 11

/* server1.

c */
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>

int main(int argc, char *argv[])

{
struct sockaddr_in sAddr;
fd_set readset, testset;
int listensock;
int newsock;
char buffer[25];
int result;
int nread;
int x;
int val;

listensock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

val = 1;
result = setsockopt(listensock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
if (result < 0) {

perror("server1");
return 0;
}

sAddr.sin_family = AF_INET;
sAddr.sin_port = htons(1972);
sAddr.sin_addr.s_addr = INADDR_ANY;
result = bind(listensock, (struct sockaddr *) &sAddr, sizeof(sAddr));
if (result < 0) {
perror("server1");
return 0;
}

result = listen(listensock, 5);


if (result < 0) {
perror("server1");
return 0;
}

FD_ZERO(&readset);
FD_SET(listensock, &readset);

while (1) {
testset = readset;
result = select(FD_SETSIZE, &testset, NULL, NULL, NULL);
if (result < 1) {
perror("server1");
return 0;
}
for (x = 0; x < FD_SETSIZE; x++) {
if (FD_ISSET(x, &testset)) {

if (x == listensock) {
newsock = accept(listensock, NULL,NULL);
FD_SET(newsock, &readset);
}
else {
nread = recv(x, buffer, 25, 0);
if (nread <= 0) {
close(x);
FD_CLR(x, &readset);
printf("client on descriptor #%i disconnected\n", x);
}
else {
buffer[nread] = '\0';
printf("%s\n", buffer);
send(x, buffer, nread, 0);
}
}
}
}
}
}

/* server2.c */
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#include <sys/wait.h>
#include <signal.h>

#include <netdb.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>

void sigchld_handler(int signo)


{
while (waitpid(-1, NULL, WNOHANG) > 0);
}

int main(int argc, char *argv[])


{
struct sockaddr_in sAddr;
int listensock;
int newsock;
char buffer[25];
int result;
int nread;
int pid;
int val;

listensock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

val = 1;
result = setsockopt(listensock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
if (result < 0) {

perror("server2");
return 0;
}

sAddr.sin_family = AF_INET;
sAddr.sin_port = htons(1972);
sAddr.sin_addr.s_addr = INADDR_ANY;
result = bind(listensock, (struct sockaddr *) &sAddr, sizeof(sAddr));
if (result < 0) {
perror("server2");
return 0;
}

result = listen(listensock, 5);


if (result < 0) {
perror("server2");
return 0;
}

signal(SIGCHLD, sigchld_handler);

while (1) {
newsock = accept(listensock, NULL, NULL);
if ((pid = fork())==0) {
printf("child process %i created.\n", getpid());
close(listensock);
nread = recv(newsock, buffer, 25, 0);
buffer[nread] = '\0';
printf("%s\n", buffer);
send(newsock, buffer, nread, 0);
close(newsock);

printf("child process %i finished.\n", getpid());


exit(0);
}
close(newsock);
}
}

/* server3.c */
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#include <sys/wait.h>
#include <signal.h>

#include <netdb.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>

int main(int argc, char *argv[])

{
struct sockaddr_in sAddr;
int listensock;
int newsock;
char buffer[25];
int result;
int nread;
int pid;
int nchildren = 1;
int x;
int val;

if (argc > 1) {
nchildren = atoi(argv[1]);
}

listensock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

val = 1;
result = setsockopt(listensock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
if (result < 0) {
perror("server3");
return 0;
}

sAddr.sin_family = AF_INET;
sAddr.sin_port = htons(1972);
sAddr.sin_addr.s_addr = INADDR_ANY;
result = bind(listensock, (struct sockaddr *) &sAddr, sizeof(sAddr));
if (result < 0) {
perror("server3");

return 0;
}

result = listen(listensock, 5);


if (result < 0) {
perror("server3");
return 0;
}

for (x = 0; x < nchildren; x++) {


if ((pid = fork()) == 0) {
while (1) {
newsock =
accept(listensock, NULL,NULL);
printf("client connected to child process %i.\n", getpid());
nread = recv(newsock, buffer, 25, 0);
buffer[nread] = '\0';
printf("%s\n", buffer);
send(newsock, buffer, nread, 0);
close(newsock);
printf( "client disconnected from child process %i.\n", getpid());
}
}
}
wait(NULL);
}

/* client.c */
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>

void child_func(int childnum);

int main(int argc, char *argv[])


{
int nchildren = 1;
int pid;
int x;
if (argc > 1) {
nchildren = atoi(argv[1]);
}

for (x = 0; x < nchildren; x++) {


if ((pid = fork()) == 0) {
child_func(x + 1);
exit(0);
}

wait(NULL);
return 0;
}

void child_func(int childnum)


{
int sock;
struct sockaddr_in sAddr;
char buffer[25];

memset((void *) &sAddr, 0, sizeof(struct sockaddr_in));


sAddr.sin_family = AF_INET;
sAddr.sin_addr.s_addr = INADDR_ANY;
sAddr.sin_port = 0;
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
bind(sock, (const struct sockaddr *) &sAddr, sizeof(sAddr));
sAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
sAddr.sin_port = htons(1972);
if (connect(sock, (const struct sockaddr *) &sAddr, sizeof(sAddr)) != 0) {
perror("client");
return;
}

snprintf(buffer, 128, "data from client #%i.", childnum);


sleep(1);
printf("child #%i sent %i chars\n", childnum, send(sock, buffer,strlen(buffer), 0));
sleep(1);
printf("child #%i received %i chars\n", childnum,recv(sock, buffer, 25, 0));

sleep(1);
close(sock);
}

You might also like