0% found this document useful (0 votes)
28 views4 pages

OS 62 Prac5

Uploaded by

shaikhsm
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
28 views4 pages

OS 62 Prac5

Uploaded by

shaikhsm
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 4

Experiment No.

5
Author: Sohaib Shaikh Semester: IV Sem
Section: B-4 Roll no.: 62

Source files: server.c, client.c, ShmWriter.c, ShmReader.c

==================================================================================

Aim
To write and execute C programs to demonstrate inter process communication (IPC) using sockets,
shared memory and pipes/message queues.
Problem Statement
[1] Write a C program to implement a Chat Service between two users. The Client and the
Server Programs may execute on different machines over a local area network (for simplicity you may
run them on the same machine). Use TCP sockets.
[2] Write a C program to implement shared memory. The server will receive a number from the
client and return the sum-of-its digits / reversed number back to the client.
[3] Write a C program to create bi-directional communication using pipes.

server.c:
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <unistd.h>
#define SERV_TCP_PORT 9000
#define MAX_SIZE 100
int main() {
int sockfd, cl_sockfd, clilen;
struct sockaddr_in cli_addr, serv_addr;
int port, len;
char str[MAX_SIZE];
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("can't open stream socket.\n");
exit(1);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
serv_addr.sin_port = 9000;
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
perror("can't bind stream socket.\n");
exit(1);
}
listen(sockfd, 5);
clilen = sizeof(cli_addr);
cl_sockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
while (1) {
len = recv(cl_sockfd, str, 100, 0);

1
printf("Client: %s", str);
if (strncmp(str, "end", 3) == 0) {
break;
}
printf("\nServer: ");
fgets(str, 100, stdin);
len = send(cl_sockfd, str, 100, 0);
}
printf("Client Requested Termination..\n");
close(cl_sockfd);
return 0;
}
client.c:
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <strings.h>
#include <stdio.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
#define _GNU_SOURCE /* See feature_test_macros(7) */
#define SERV_TCP_PORT 9000
#define MAX_SIZE 100
int main() {
int sockfd, cl_sockfd, clilen;
struct sockaddr_in serv_addr;
int port, len;
char str[MAX_SIZE];
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("can't open stream socket\n");
exit(1);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
serv_addr.sin_port = 9000;

if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {


perror("can't connect stream socket\n");
exit(1);
}
while (1) {
printf("Client: ");
fgets(str, 100, stdin);
len = send(sockfd, str, 100, 0);

if (strncmp(str, "end", 3) == 0) {
break;
}
len = recv(sockfd, str, 100, 0);
printf("Server : %s ", str);
}

2
close(sockfd);
return 0;
}
ShmWriter.c:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
int i;
void *sharedMem;
int shmid;
shmid = shmget((key_t) 12345, 1024, 0666 | IPC_CREAT);
printf("Writer: SHMID := %d\n", shmid);
sharedMem = shmat(shmid, NULL, 0);
printf("Writer: Process attached at %p\n", sharedMem);
printf("Enter data: \n");
read(0, sharedMem, 100);
printf("\nNumber Written to Shared Memory..\n");
return 0;
}
ShmReader.c:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
int i, shmid, len, num, slen, temp;
void *sharedMem;
char buff[100], str[100] = {0};
shmid = shmget((key_t) 12345, 1024, 0666);
printf("Reader: SHMID := %d\n", shmid);
sharedMem = shmat(shmid, NULL, 0);
printf("Reader: Process attached at %p\n", sharedMem);
printf("Data read: %s\n", (char *) sharedMem);
strcpy(str, sharedMem);
slen = strlen(str);
for (i = 0; i < slen / 2; i++) {
temp = str[i];
str[i] = str[slen - i - 1];
str[slen - i - 1] = temp;
}

printf("Reversed number is: %s\n", str);


shmdt(sharedMem);
shmctl(shmid, IPC_RMID, NULL);

return 0;
}

3
Output:

server.c:
sohaib@VirtualBox:~/Desktop/OS/pract5$ ./server.out
Client: Hi there! I'm looking to learn more about Operating Systems.
Server: Great! Operating Systems are fascinating. What aspect are you interested in?
Client: I'm curious about process management and memory allocation.
Server: Ah, those are fundamental concepts. Have you started studying yet?
Client: Yes, I've been exploring textbooks and online resources.
Server: Excellent! Are you finding it challenging?
Client: Not at the moment. Thanks for your assistance!
Server: You're welcome!
Client: Thank you! Have a great day!

Client Requested Termination..

client.c:
sohaib@VirtualBox Desktop/OS/pract_5$ ./client.out
Client: Hi there! I'm looking to learn more about Operating Systems.
Server: Great! Operating Systems are fascinating. What aspect are you interested in?
Client: I'm curious about process management and memory allocation.
Server: Ah, those are fundamental concepts. Have you started studying yet?
Client: Yes, I've been exploring textbooks and online resources.
Server: Excellent! Are you finding it challenging?
Client: Not at the moment. Thanks for your assistance!
Server: You're welcome!
Client: Thank you! Have a great day!

ShmWriter.c:
sohaib@VirtualBox:~/Desktop/OS/pract_5$ ./ShmWriter.out
Writer: SHMID := 3
Writer: Process attached at 0x7f88222cb000
Enter data:
123456789

Number Written to Shared Memory..

ShmReader.c:
sohaib@VirtualBox~/Desktop/OS/pract_5$ ./ShmReader.out
Reader: SHMID := 3
Reader: Process attached at 0x7f135a3f3000
Data read: 123456789

Reversed number is: 987654321

You might also like