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.
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.