I am trying to make a simple CLI messaging in C . I found out about sockets .
I have wrote a simple program where client can write some message and server prints it in server side
I tried opening multiple clients and it only accepted one client,
I wanna make a program where many clients can join up server instead of one and write some messages , currently only server prints client messages in server side but when other clients join
and send message
I want clients to be able to see other client messages
Currently i have
server.c
/*
server.c
*/
#include <stdio.h>
#include <unistd.h>
#include <strings.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define MAX 256
#define PORT 8080
int main() {
int socket_return, accept_return, bind_return, listen_return;
struct sockaddr_in server_address, peer_address;
// Creating socket
socket_return = socket(AF_INET, SOCK_STREAM, 0);
if (socket_return == -1) {
perror("socket creation failedn");
return -1;
} else {
printf("socket createdn");
}
//empty the server address`
bzero(&server_address, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(PORT);
// binding socket
bind_return = bind(socket_return, (struct sockaddr *)&server_address, sizeof(server_address));
if (bind_return == -1) {
perror("binding failedn");
close(socket_return);
return -1;
} else {
printf("binding donen");
}
// listening the socket
listen_return = listen(socket_return, 5);
if (listen_return == -1) {
perror("listening failed");
close(socket_return);
return -1;
} else {
printf("server is listening...n");
}
socklen_t peer_address_len = sizeof(peer_address);
// accept connection
accept_return = accept(socket_return, (struct sockaddr *)&peer_address, &peer_address_len);
if (accept_return == -1) {
perror("accepting failedn");
close(socket_return);
return -1;
} else {
printf("connection acceptedn");
}
char msg[MAX];
while (1) {
bzero(msg, sizeof(msg));
// Read message
ssize_t bytes_read = read(accept_return, msg, sizeof(msg) );
if (bytes_read == 0) {
printf("client disconnectedn");
break;
} else if (bytes_read < 0) {
perror("failed to read messagen");
break;
}
//displaying client message
printf("From client: %s", msg);
}
// closing
close(accept_return);
close(socket_return);
return 0;
}
client.c
/*
client.c
*/
#include <stdio.h>
#include <strings.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define MAX 256
#define PORT 8080
int main() {
int socket_return, connect_return;
struct sockaddr_in server_address;
// Creating socket
socket_return = socket(AF_INET, SOCK_STREAM, 0);
if (socket_return == -1) {
printf("socket creation failedn");
return -1;
} else {
printf("socket createdn");
}
bzero(&server_address, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = inet_addr("127.0.0.1");
server_address.sin_port = htons(PORT);
// Connecting the server
connect_return = connect(socket_return, (struct sockaddr *)&server_address, sizeof(server_address));
if (connect_return == -1) {
printf("connection failedn");
close(socket_return);
return -1;
} else {
printf("connected to servern");
}
char msg[MAX];
int i;
while (1) {
bzero(msg, sizeof(msg));
printf("Enter string: ");
i = 0;
while ((msg[i++] = getchar()) != 'n');
//when server detects the client message as 'exit' close the server
if ((strncmp(msg, "exit", 4)) == 0) {
printf("Exiting clientn");
close(socket_return);
break;
}
// sending message
write(socket_return, msg, sizeof(msg));
printf("You wrote %sn",msg);
}
// close
close(socket_return);
return 0;
}