Sei sulla pagina 1di 39

1

Week1.

Implement the following forms of IPC. a)Pipes b)FIFO

a)Pipes(oneway communication)

#include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<string.h> #include<stdlib.h> int main() { int fd[2],nbytes; pid_t childpid; char string[]="hello world!\n"; char readbuffer[80]; pipe(fd); if((childpid=fork())==-1) { printf("fork error"); exit(1); } if(childpid==0) { close(fd[0]);

write(fd[1],string,(strlen(string)+1)); exit(0); } else { close(fd[1]); nbytes=read(fd[0],readbuffer,sizeof(readbuffer)); printf("received string %s",readbuffer); } return(0); }

pipes(twoway pipes communication) #include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<string.h> #include<stdlib.h> int main(void) { int fd[2],fd1[2],nbytes; pid_t childpid; char str[]="this is nplab"; char str1[]="hello how are you"; char rdbuff[80]; pipe(fd); pipe(fd1); if((childpid=fork())==-1) { printf("fork error"); exit(1); } if(childpid==0) { close(fd[0]); close(fd1[1]); write(fd[1],str,strlen(str)+1);

nbytes=read(fd1[0],rdbuff,sizeof(rdbuff)); printf("\n client received string %s\n", rdbuff); exit(0); } else { close(fd[1]); close(fd1[0]); write(fd1[1],str1,strlen(str1)+1); nbytes=read(fd[0],rdbuff,sizeof(rdbuff)); printf("\n server received string %s\n",rdbuff); } return(0); }

(Or) Oneway pipe #include<stdio.h> #include<sys/types.h> main() { int i=1,j,n,pid; int p[2]; char msg[20]; pipe(p); printf("how many child process you want to create \n"); scanf("%d",&n); pid=getpid(); for(i=1;i<=n;i++) { fork(); if(pid==getpid()) { for(j=0;j<=n;j++) wait((int *)0); for(j=0;j<n;j++) { read(p[0],msg,sizeof(msg)); printf("%s",msg); }

} else { printf("enter the string"); scanf("%s",msg); write(p[1],msg,sizeof(msg)); } } }

Twoway pipe #include<stdio.h> #include<unistd.h> #include<sys/types.h> main() { int pid,j; char msg1[20]; char msg2[20],msg3[20]; int pp[2],pc[2]; pipe(pc); pipe(pp); pid=fork(); if(pid==0) { close(pc[0]); close(pp[1]); write(pc[1],"hello papa",15); read(pp[0],msg2,15); printf("%s\n",msg2); write(pc[1],"thank you papa",15); } else { close(pc[1]);

close(pp[0]); read(pc[0],msg1,15); printf("%s\n",msg1); write(pp[1],"hello my child",15); read(pc[0],msg3,15); printf("%s\n",msg3); } }

b) fifo (server side half duplex) #include<stdio.h> #include<ctype.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<stdlib.h> #define HALF_DUPLEX "./anjani" #define MAX_BUF_SIZE 255 int main() { int fd,ret_val,count,numread; char buf[MAX_BUF_SIZE]; ret_val=mkfifo(HALF_DUPLEX,0666); if(ret_val==-1) { printf("error creating the named pipe \n"); exit(1); } fd=open(HALF_DUPLEX,O_RDONLY); numread=read(fd,buf,MAX_BUF_SIZE); buf[numread]='\0'; printf("half duplex server read form the pipe %s\n",buf); }

fifo(halfduplex client side) #include<stdio.h> #include<ctype.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<stdlib.h> #define HALF_DUPLEX "./anjani" #define MAX_BUF_SIZE 255 int main(int argc,char *argv[]) { int fd,buf,numread; if(argc!=2) { printf("usage %s <string to be sent to server", argv[0]); exit(1); } fd=open(HALF_DUPLEX,O_WRONLY); write(fd,argv[1],strlen(argv[1])); }

Fifo(full duplex) #include<fcntl.h> #include<stdlib.h> #include<errno.h> #include<ctype.h> #define HALF_DUPLEX "./halfduplex" #define FULL_DUPLEX "./fulduplex" #define MAX_BUF_SIZE 255 int main(int argc,char *argv[]) { int fd1,fd2,ret_val,count,numread; char buf[MAX_BUF_SIZE]; ret_val=mkfifo(HALF_DUPLEX,0666); ret_val=mkfifo(FULL_DUPLEX,0666); if((ret_val==-1)&&(errno==EEXIST)) { printf("error creating the named pipe \n"); exit(0); } fd1=open(HALF_DUPLEX,O_RDONLY); fd2=open(FULL_DUPLEX,O_WRONLY); numread=read(fd1,buf,MAX_BUF_SIZE); buf[numread]='\0'; printf("full duplex server read from the pipe %s\n",buf); write(fd2,argv[1],strlen(argv[1]));

fifo ( client side fullduplex) #include<stdio.h> #include<ctype.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<string.h> #include<fcntl.h> #include<stdlib.h> #define HALF_DUPLEX "./halfduplex" #define FULL_DUPLEX "./fulduplex" #define MAX_BUF_SIZE 255 int main(int argc,char *argv[]) { int fd1,numread,fd2; char buf[MAX_BUF_SIZE]; if(argc!=2) { printf("usage %s <string to be sent to server",argv[0]); exit(1); } fd1=open(HALF_DUPLEX,O_WRONLY); fd2=open(FULL_DUPLEX,O_RDONLY); write(fd1,argv[1],strlen(argv[1])); numread=read(fd2,buf,MAX_BUF_SIZE);

buf[numread]='\0'; printf("fullduplex client read from pipe %s\n",buf); }

(Or) b) Named Pipe: Full Duplex: #define NP1 "/tmp/np1" #define NP2 "/tmp/np2" #define MAX_BUF_SIZE 255 #include <stdio.h> #include <errno.h> #include <ctype.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include<string.h> int main(int argc, char *argv[]) { int rdfd, wrfd, ret_val, count, numread; char buf[MAX_BUF_SIZE]; ret_val = mkfifo(NP1, 0666); if ((ret_val == -1) && (errno != EEXIST)) { perror("Error creating the named pipe"); exit (1); } ret_val = mkfifo(NP2, 0666); if((ret_val == -1) && (errno != EEXIST)) {

perror("Error creating the named pipe"); exit (1); } rdfd = open(NP1, O_RDONLY); wrfd = open(NP2, O_WRONLY); numread = read(rdfd, buf, MAX_BUF_SIZE); buf[numread] = '0'; printf("Full Duplex Server : Read From the pipe : %s\n", buf); count = 0; while (count < numread) { buf[count] = toupper(buf[count]); count++; } write(wrfd, buf, strlen(buf)); }

Client fifo #include <stdio.h> #include <errno.h> #include <ctype.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #define NP1 "/tmp/np1" #define NP2 "/tmp/np2" #define MAX_BUF_SIZE 255 #include <stdlib.h> #include<string.h> int main(int argc, char *argv[]) { int wrfd, rdfd, numread; char rdbuf[MAX_BUF_SIZE]; if (argc != 2) { printf("Usage : %s <string to be sent to the server>n", argv[0]); exit (1); } wrfd = open(NP1, O_WRONLY); rdfd = open(NP2, O_RDONLY); write(wrfd, argv[1], strlen(argv[1])); numread = read(rdfd, rdbuf, MAX_BUF_SIZE); rdbuf[numread] = '0';

printf("Full Duplex Client : Read From the Pipe : %s\n", rdbuf); }

Week2. Implement file transfer using Message Queue form of IPC

At sender side: #include<stdio.h> #include<unistd.h> #include<string.h> #include<stdlib.h> #include<sys/types.h> #include<sys/ipc.h> #include<sys/msg.h> main() { int qid,len; struct { long mtype; char mtext[100]; }send,recv; qid=msgget((key_t)2500,IPC_CREAT|0666); if(qid==-1) { perror("msg get failed"); exit(1); } for(;;)

{ init(send.mtext); for(;;) { fflush(stdin); gets(send.mtext); if(send.mtext[0]=='\0') continue; break; } send.mtype=1; len=strlen(send.mtext); if(msgsnd(qid,&send,len+1,0)==-1) { perror("msg send fail"); exit(1); } if(strcmp("bye",send.mtext)==0) exit(0); init(recv.mtext); if(msgrcv(qid,&recv,100,2,0)==-1) { perror("msg received failed"); exit(1); }

if(strcmp("bye",recv.mtext)==0) exit(0); printf("%s\n",recv.mtext); } } init(str) char *str; { int i; for(i=0;i<100;i++) str[i]=' '; }

Receiver side #include<unistd.h> #include<stdio.h> #include<sys/ipc.h> #include<sys/types.h> #include<sys/msg.h> main() { int qid,len; struct { long mtype; char mtext[100]; }send,recv; qid=msgget((key_t)2500,IPC_CREAT|0666); if(qid==-1) { perror("msg get failed"); exit(1); } for(;;) { init(recv.mtext); if(msgrcv(qid,&recv,100,1,0)==-1) {

perror("msg rcv failed"); exit(1); } printf("%s \n",recv.mtext); if(strcmp("bye",recv.mtext)==0) exit(0); init(send.mtext); for(;;) { fflush(stdin); gets(send.mtext); if(send.mtext[0]=='\0') continue; break; send.mtype=2; len=strlen(send.mtext); send.mtext[len]='\0'; if(msgsnd(qid,&send,len+1,0)==-1) { perror("msg send failed \n"); exit(1); } if(strcmp("bye",send.mtext)==0) exit(0); }

} } init(str) char *str; { int i; for(i=0;i<100;i++) str[i]=' '; }

Week3. Write a program to create an integer variable using shared memory concept and increment the variable simultaneously by two processes. Use semaphores to avoid race conditions

#include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <unistd.h> #include <string.h> #include <errno.h> int main(void) { pid_t pid; int *shared; int shmid; shmid = shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT | 0666); printf("Shared Memory ID=%u",shmid); if (fork() == 0) { shared = shmat(shmid, (void *) 0, 0); printf("Child pointer %u\n", shared); *shared=1; printf("Child value=%d\n", *shared); sleep(2); printf("Child value=%d\n", *shared); } else

{ shared = shmat(shmid, (void *) 0, 0); printf("Parent pointer %u\n", shared); printf("Parent value=%d\n", *shared); sleep(1); *shared=42; printf("Parent value=%d\n", *shared); sleep(5); shmctl(shmid, IPC_RMID, 0); } }

Week4. Design TCP iterative Client and server application to reverse the given input sentence Server side #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/wait.h> #include <fcntl.h> #include <unistd.h> #define MYPORT 13154 void readstring(int,char *); int main(int C, char *V[] ) { int listensocket,connectionsocket,retbind; struct sockaddr_in serveraddress,cliaddr; socklen_t len; char buf[100],databuf[1024]; listensocket = socket(AF_INET, SOCK_STREAM, 0 );

if (listensocket < 0 ) { perror("socket" ); exit(1); } memset(&serveraddress, 0, sizeof(serveraddress) ); serveraddress.sin_family = AF_INET; serveraddress.sin_port = htons(MYPORT); serveraddress.sin_addr.s_addr = htonl(INADDR_ANY); retbind=bind(listensocket,(struct sockaddr*)&serveraddress, sizeof(serveraddress)); if(-1==retbind) { perror("BIND ERROR\n"); exit(1); } listen(listensocket,5); for (;;) { printf("Server:I am waiting-----Start of Main Loop\n"); len=sizeof(cliaddr); connectionsocket=accept(listensocket, (struct sockaddr*)&cliaddr,&len); if (connectionsocket < 0) {

if (errno == EINTR) printf("Interrupted system call ??"); continue; } printf("Connection from %s\n", inet_ntop(AF_INET,&cliaddr.sin_addr,buf,sizeof(buf))); readstring(connectionsocket , databuf); close(connectionsocket); printf("Finished Serving One Client\n"); } } void readstring( int connectionsocket, char *fname) { int pointer=0,n; int len=0,a,b; char rev[50],temp[50],temp1[50]; int k,i; while ((n=read(connectionsocket,(fname + pointer),1024))>0) { pointer=pointer+n; } fname[pointer]='\0'; printf("enter the string\n");

printf("Server :Received %s\n " ,fname); k=strlen(fname); a=0; for(i=k-1;i>=0;i--) temp[a++]=fname[i]; temp[a]='\0'; printf("\nrev is %s\n", temp); }

Client side #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <fcntl.h> #define MAXBUFFER 1024 void sendstring(int , char *); int main( int C, char *V[] ) { int sd,fd; char c; struct sockaddr_in serveraddress; char text[100]; int i=0; sd = socket( AF_INET, SOCK_STREAM, 0 ); if( sd < 0 ) { perror( "socket" );

exit( 1 ); } if (V[1] == NULL ) { printf ("PL specfiy the server's IP Address \n"); exit(0); } if (V[2] == NULL ) { printf ("PL specify the server's Port No \n"); exit(0); } memset( &serveraddress, 0, sizeof(serveraddress) ); serveraddress.sin_family = AF_INET; serveraddress.sin_port = htons(atoi(V[2])); serveraddress.sin_addr.s_addr = inet_addr(V[1]); if (connect(sd,(struct sockaddr*)&serveraddress, sizeof(serveraddress))<0) { printf("Cannot Connect to server"); exit(1); } printf("enter sentence to end enter #"); while(1) { c=getchar(); #include <stdio.h>

#include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <fcntl.h> #define MAXBUFFER 1024 void sendstring(int , char *); int main( int C, char *V[] ) { int sd,fd; char c; struct sockaddr_in serveraddress; char text[100]; int i=0; sd = socket( AF_INET, SOCK_STREAM, 0 ); if( sd < 0 ) { perror( "socket" ); exit( 1 ); }

if (V[1] == NULL ) { printf ("PL specfiy the server's IP Address \n"); exit(0); } if (V[2] == NULL ) { printf ("PL specify the server's Port No \n"); exit(0); } memset( &serveraddress, 0, sizeof(serveraddress) ); serveraddress.sin_family = AF_INET; serveraddress.sin_port = htons(atoi(V[2])); serveraddress.sin_addr.s_addr = inet_addr(V[1]); if (connect(sd,(struct sockaddr*)&serveraddress, sizeof(serveraddress))<0) { printf("Cannot Connect to server"); exit(1); } printf("enter sentence to end enter #"); while(1) { c=getchar(); if(c=='#')

break; text[i++]=c; } text[i]='\0'; sendstring(sd,text); close(sd); return 0; } void sendstring(int sd, char *fname) { int n , byteswritten=0 , written ; char buffer[MAXBUFFER]; strcpy(buffer , fname); n=strlen(buffer); while (byteswritten<n) { written=write(sd , buffer+byteswritten,(n-byteswritten)); byteswritten+=written; } printf("String : %s sent to server \n",buffer); }

Week7. Design a TCP concurrent server to convert a given text into upper case using multiplexing system call select

Potrebbero piacerti anche