Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Handling multiple sockets with a single server in C programming. I am trying to

ID: 659495 • Letter: H

Question

Handling multiple sockets with a single server in C programming. I am trying to do this without ports so no sockaddr_in. evereything is using AF_UNIX. Here is what I have so far, can anyone help me with this?

SERVER.C

#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define TRUE   1
#define FALSE   0

char *socket_path = "SOCKET1";
int main(int argc, char *argv[]) {
   int master_socket, addrlen, new_socket, client_socket[3], max_clients = 3, activity, i, valread, sd;
   int max_sd;
   struct sockaddr_un addr;
   char buffer[100];
   fd_set readfds;
   char *message = "hello";

   if(argc > 3) {
       socket_path = argv[3];
   }

   if((master_socket = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
       perror("socket error");
       exit(EXIT_FAILURE);
   }

   addrlen = sizeof(addr);
   memset(&addr, 0, addrlen);
   addr.sun_family = AF_UNIX;
   strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path)-1);

   unlink(socket_path);

   if(bind(master_socket, (struct sockaddr*)&addr, addrlen) < 0) {
       perror("bind error");
       exit(EXIT_FAILURE);
   }

   if(listen(master_socket, 3) < 0) {
       perror("listen");
       exit(EXIT_FAILURE);
   }

   puts("Waiting for Connections ...");
   while(TRUE) {
       FD_ZERO(&readfds);

       FD_SET(master_socket, &readfds);
       max_sd = master_socket;

       for(i = 0; i < max_clients; i++) {
           //printf("meh");
           sd = client_socket[i];
           if(sd > 0) {
               FD_SET(sd, &readfds);
           }

           if(sd > max_sd) {
               max_sd = sd;
           }
       }
      
       activity = select( max_sd+1, &readfds,NULL,NULL,NULL);

       if((activity < 0) && (errno != EINTR)) {
           printf("select error");
       }
       if(FD_ISSET(master_socket, &readfds)) {
           if( (new_socket = accept(master_socket, (struct sockaddr *)&addr, (socklen_t*)&addrlen)) < 0) {
               perror("accept");
               exit(EXIT_FAILURE);
           }
           printf("New Connections");

           if(send(new_socket, message, strlen(message), 0) != strlen(message)) {
               perror("send error");
           }
           for(i = 0; i < max_clients; i++) {
               if(client_socket[i] == 0) {
                   client_socket[i] = new_socket;
                   printf("Adding");
                   break;
               }
           }
       }

       for(i = 0; i < max_clients; i++) {
           sd =client_socket[i];

           if(FD_ISSET(sd, &readfds)) {
               if((valread = read(sd, buffer, 1024)) == 0) {
                   getpeername(sd, (struct sockaddr*)&addr, (socklen_t*)&addrlen);
                   printf("Host disconnected");
                   close(sd);
                   client_socket[i] = 0;
               }

               else
               {
                   buffer[valread]='';
                   send(sd, buffer, strlen(buffer), 0);
               }
           }
       }
   }
   return 0;
}

CLIENT.C

#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

char *socket_path = "SOCKET1";

int main(int argc, char *argv[]) {
   struct sockaddr_un addr;
   char buffer[100];
   int client_socket, ready_socket;

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

   if( (client_socket = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
       perror("socket error");
       exit(EXIT_FAILURE);
   }

   memset(&addr, 0, sizeof(addr));
   addr.sun_family = AF_UNIX;
   strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path)-1);

   if(connect(client_socket, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
       perror("connection error");
       exit(EXIT_FAILURE);
   }

   while( (ready_socket=read(STDIN_FILENO, buffer, sizeof(buffer))) > 0) {
       if(write(client_socket, buffer, ready_socket) != ready_socket) {
           if(ready_socket > 0) {
               fprintf(stderr, "partial write");
           } else {
               perror("write error");
               exit(EXIT_FAILURE);
           }
       }
   }
   return 0;
}

Explanation / Answer

It is far better program for handling multiple server.

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Chat Now And Get Quote