Code:
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void server_process(int);
void client_1(void);
void client_2(int);
void client_3(int);
void client_4(int);
void main(void)
{
int s1;
int s2;
int s3;
int s4;
int status;
struct sockaddr server = {AF_UNIX, "theserver"};
s1 = socket (AF_UNIX, SOCK_STREAM, 0);
bind(s1, &server, sizeof(server));
struct sockaddr AB = {AF_UNIX, "ABSOCKET"};
s2 = socket(AF_UNIX, SOCK_STREAM,0);
unlink(AB.sa_data);
bind(s2, &AB, sizeof(AB));
struct sockaddr AC = {AF_UNIX, "ACSOCKET"};
s3 = socket (AF_UNIX, SOCK_STREAM, 0);
unlink(AC.sa_data);
bind(s3, &AC, sizeof(AC));
struct sockaddr AD = {AF_UNIX, "ADSOCKET"};
s4 = socket(AF_UNIX, SOCK_STREAM, 0);
unlink(AD.sa_data);
bind(s4, &AD, sizeof(AD));
listen(s1, 3);
listen(s2, 1);
listen(s3, 1);
listen(s4, 1);
if(!fork()) {server_process (s1); _exit(0);}
if(!fork()) {client_1(); _exit(0);}
if(!fork()) {client_2(s2); _exit(0);}
if(!fork()) {client_3(s3); _exit(0);}
if(!fork()) {client_4(s4); _exit(0);}
wait (&status); wait (&status); wait (&status); wait (&status);
wait (&status);
unlink("theserver");
unlink("ABSOCKET");
unlink("ACSOCKET");
unlink("ADSOCKET");
}
void server_process(int ls)
{
int sc1, sc2, sc3, sc4;
int rmask;
int i;
long now;
char buf[100];
struct sockaddr who;
int len;
len = sizeof(who);
sc1 = accept(ls, &who, &len);
printf("Connection from %s on socket #%d\n", who.sa_data, sc1);
len = sizeof(who);
sc2 = accept(ls, &who, &len);
printf("Connection from %s on socket #%d\n", who.sa_data, sc2);
len = sizeof(who);
sc3 = accept(ls, &who, &len);
printf("Connection from %s on socket #%d\n", who.sa_data, sc3);
close(ls);
for(i=0; i<10; i++)
{
rmask = (1<<sc1) | (1<<sc2) | (1<<sc3);
select (32, &rmask, 0,0,0);
if (rmask & (1<< sc1))
read(sc1, buf, 100);
else if(rmask & (1<< sc2))
read (sc2, buf, 100);
else if(rmask & (1<<sc3))
read(sc3, buf, 100);
time(&now);
printf("%s %s", buf, ctime (&now));
}
close(sc1);
close(sc2);
}
void client_1(void)
{
struct sockaddr me = {AF_UNIX, "client1"};
struct sockaddr there = {AF_UNIX, "theserver"};
struct sockaddr socket2 = {AF_UNIX, "client2"};
struct sockaddr mom = {AF_UNIX, "ABSOCKET"};
char msgbuf[100];
int s, i, a, b;
s = socket(AF_UNIX, SOCK_STREAM, 0);
bind(s, &me, sizeof(me));
connect(s, &there, sizeof(there));
b= socket(AF_UNIX, SOCK_STREAM, 0);
unlink(socket2.sa_data);
if(bind(b, &socket2, sizeof(socket2))<0)
{
perror("bind:error");
printf("failed bind2\n");
}
connect(b, &mom, sizeof(mom));
int w=0;
for( i=0; i<5; i++)
{
char astring[3];
char message[20];
int randomNumber = rand() %2;
if(randomNumber ==0)
{
astring[0] = 'D';
astring[1] = w+48;
astring[2] = '\0';
}
if(randomNumber == 1)
{
astring[0]= 'C';
astring[1] = w+48;
astring[2]= '\0';
}
strcpy(message, "A sends B ");
strcat(message, astring);
write(b, astring, 3);
write(s, message, 100);
w++;
//sprintf(msgbuf, "Message %d from CLient1 ", i);
//write(s, msgbuf, strlen(msgbuf) +1);
sleep(1);
}
sleep(30);
close(s);
unlink("client1");
}
void client_2(int ls)
{
int sc1;
char buffer[3];
char buff[60];
char buffD[60];
buffer[0]= '\0';
buff[0]='\0';
buffD[0]='\0';
struct sockaddr me = {AF_UNIX, "client2"};
struct sockaddr there = {AF_UNIX, "theserver"};
char msgbuf[100];
int s, i;
s = socket (AF_UNIX, SOCK_STREAM, 0);
bind(s, &me, sizeof(me));
connect(s, &there, sizeof(there));
struct sockaddr who;
int len;
len =sizeof(who);
sc1 = accept(ls, &who, &len);
printf("connection1 from %s on socket #%d\n", who.sa_data, sc1);
for(i=0; i<5; i++)
{
if((read(sc1, buffer, 3))>0)
{
if(buffer[0] == 'C')
{
strcat(buff, buffer);
sprintf(msgbuf, " B sends to C %s ", buffer);
write(s, msgbuf, strlen(msgbuf) +1);
}
if(buffer[0] == 'D')
{
strcat(buffD, buffer);
sprintf(msgbuf, " B sends to D %s ", buffer);
write(s, msgbuf, strlen(msgbuf) +1);
}
}
sleep (1);
}
int Y, R;
struct sockaddr me2 = {AF_UNIX, "client3"};
struct sockaddr there2 = {AF_UNIX, "ACSOCKET"};
Y = socket(AF_UNIX, SOCK_STREAM,0);
unlink(me2.sa_data);
connect(Y, &there2, sizeof(there2));
write(Y, buff, strlen (buff) +1);
close(Y);
unlink("client3");
struct sockaddr me3 = {AF_UNIX, "client4"};
struct sockaddr there3 = {AF_UNIX, "ADSOCKET"};
R= socket(AF_UNIX, SOCK_STREAM, 0);
unlink(me3.sa_data);
connect(R, &there3, sizeof(there3));
write(R, buffD, sizeof(buffD) +1);
close(R);
unlink("client4");
close(s);
unlink("client2");
printf("%s\n", buff);
printf("%s\n", buffD);
}
void client_3(int ls)
{
int sc1;
char buff[100];
struct sockaddr who;
int len;
len = sizeof(who);
sc1 = accept(ls, &who, &len);
if(sc1<0)
{
perror("client4:accept");
}
read(sc1, buff, 100);
printf("%s\n", buff);
struct sockaddr server = {AF_UNIX, "theserver"};
struct sockaddr me = {AF_UNIX, "client5"};
int s = socket (AF_UNIX, SOCK_STREAM, 0);
unlink(me.sa_data);
if(bind(s, &me, sizeof (me))<0)
{
perror("BIND ERROR");
}
connect(s, &server, sizeof(server));
}
void client_4(int ls)
{
int sc1;
char buff[100];
struct sockaddr who;
int len;
len = sizeof(who);
sc1 = accept(ls, &who, &len);
if(sc1<0)
{
perror("client4:accept");
}
read(sc1, buff, 100);
printf("%s\n", buff);
}