Write client and server programs(using c) for interaction between server and client processes using Unix Domain sockets.

AIM:

Write client and server programs(using c) for interaction between server and client processes using Unix Domain sockets.

Program:

client1.c:

#include <stdio.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <string.h>
int main(void)
{
 struct sockaddr_un address;
 int  socket_fd, nbytes;
 char buffer[256];
 socket_fd = socket(PF_UNIX, SOCK_STREAM, 0);
 if(socket_fd < 0)
 {
  printf("socket() failed\n");
  return 1;
 }
 /* start with a clean address structure */
 memset(&address, 0, sizeof(struct sockaddr_un)); 
 address.sun_family = AF_UNIX;
 snprintf(address.sun_path, UNIX_PATH_MAX, "./demo_socket");
 if(connect(socket_fd, 
 (struct sockaddr *) &address, 
 sizeof(struct sockaddr_un)) != 0)
 {
  printf("connect() failed\n");
  return 1;
 }
 nbytes = snprintf(buffer, 256, "hello from a client");
 write(socket_fd, buffer, nbytes);
 nbytes = read(socket_fd, buffer, 256);
 buffer[nbytes] = 0;
 printf("MESSAGE FROM SERVER: %s\n", buffer);
 close(socket_fd);
 return 0;
}

server1.c:

#include <stdio.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
int connection_handler(int connection_fd)
{
 int nbytes;
 char buffer[256];
 nbytes = read(connection_fd, buffer, 256);
 buffer[nbytes] = 0;
 printf("MESSAGE FROM CLIENT: %s\n", buffer);
 nbytes = snprintf(buffer, 256, "hello from the server");
 write(connection_fd, buffer, nbytes); 
 close(connection_fd);
 return 0;
}
int main(void)
{
 struct sockaddr_un address;
 int socket_fd, connection_fd;
 socklen_t address_length;
 pid_t child; 
 socket_fd = socket(PF_UNIX, SOCK_STREAM, 0);
 if(socket_fd < 0)
 {
  printf("socket() failed\n");
  return 1;
 } 
 unlink("./demo_socket");
 /* start with a clean address structure */
 memset(&address, 0, sizeof(struct sockaddr_un));
 address.sun_family = AF_UNIX;
 snprintf(address.sun_path, UNIX_PATH_MAX, "./demo_socket");
 if(bind(socket_fd, 
 (struct sockaddr *) &address, 
 sizeof(struct sockaddr_un)) != 0)
 {
  printf("bind() failed\n");
  return 1;
 }
 if(listen(socket_fd, 5) != 0)
 {
  printf("listen() failed\n");
  return 1;
 }
 while((connection_fd = accept(socket_fd, 
 (struct sockaddr *) &address,
 &address_length)) > -1)
 {
  child = fork();
  if(child == 0)
  {
   /* now inside newly created connection handling process */
   return connection_handler(connection_fd);
  }
  /* still inside server process */
  close(connection_fd);
 }
 close(socket_fd);
 unlink("./demo_socket");
 return 0;
}

Output:

Student@ubuntu:~$gcc –o server1.out server1.c
Student@ubuntu:~$gcc client1.out client1.c
Student@ubuntu:~$ ./client1.out
MESSAGE FROM SERVER hello from the server
Student@ubuntu:~$ ./server1.out
MESSAGE FROM CLIENT hello from the CLIENT