In: Computer Science
/Below code will as you wanted...
//server.c
/*
** C socket server example, handles multiple clients using threads
** Compile
** gcc server.c -lpthread -o server
*/
#include <stdio.h>
#include <string.h> // strlen
#include <stdlib.h> // strlen
#include <sys/socket.h>
#include <arpa/inet.h> //inet_addr
#include <unistd.h> // write
#include <pthread.h> // for threading, link with lpthread
// the thread function
void *connection_handler(void *);
int main(int argc, char *argv[]) {
int socket_desc, client_sock, c;
struct sockaddr_in server, client;
// Create socket
socket_desc = socket(AF_INET, SOCK_STREAM, 0);
if(socket_desc == -1) {
printf("Could not create socket");
}
puts("Socket created");
// Prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(8888);
// Bind
if(bind(socket_desc,(struct sockaddr *)&server, sizeof(server)) < 0) {
// print the error message
perror("bind failed. Error");
return 1;
}
puts("bind done");
// Listen
listen(socket_desc, 3);
// Accept and incoming connection
puts("Waiting for incoming connections...");
c = sizeof(struct sockaddr_in);
// Accept and incoming connection
puts("Waiting for incoming connections...");
c = sizeof(struct sockaddr_in);
pthread_t thread_id;
while((client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c))) {
puts("Connection accepted");
if(pthread_create( &thread_id, NULL, connection_handler, (void*) &client_sock) < 0) {
perror("could not create thread");
return 1;
}
// Now join the thread, so that we dont terminate before the thread
// pthread_join( thread_id, NULL);
puts("Handler assigned");
}
if (client_sock < 0) {
perror("accept failed");
return 1;
}
return 0;
}
//
// This will handle connection for each client
//
void *connection_handler(void *socket_desc) {
// Get the socket descriptor
int sock = *(int*)socket_desc;
int read_size;
char *message, client_message[2000];
// Send some messages to the client
message = "Greetings! I am your connection handler\n";
write(sock, message, strlen(message));
message = "Now type something and i shall repeat what you type \n";
write(sock, message, strlen(message));
// Receive a message from client
while( (read_size = recv(sock, client_message, 2000, 0)) > 0 ) {
// end of string marker
client_message[read_size] = '\0';
// Send the message back to client
write(sock, client_message, strlen(client_message));
// clear the message buffer
memset(client_message, 0, 2000);
}
if(read_size == 0) {
puts("Client disconnected");
fflush(stdout);
}
else if(read_size == -1) {
perror("recv failed");
}
return 0;
}
//client.c
/* CLIENT CODE */
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
int main()
{
int clientSocket;
char buffer[1024];
struct sockaddr_in serverAddr;
socklen_t addr_size;
/*---- Create the socket. The three arguments are: ----*/
/* 1) Internet domain 2) Stream socket 3) Default protocol (TCP in this case) */
clientSocket = socket(PF_INET, SOCK_STREAM, 0);
/*---- Configure settings of the server address struct ----*/
/* Address family = Internet */
serverAddr.sin_family = AF_INET;
/* Set port number, using htons function to use proper byte order */
serverAddr.sin_port = htons(8888);
/* Set IP address to localhost */
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
/* Set all bits of the padding field to 0 */
memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero);
/*---- Connect the socket to the server using the address struct ----*/
addr_size = sizeof serverAddr;
connect(clientSocket, (struct sockaddr *) &serverAddr, addr_size);
/*---- Read the message from the server into the buffer ----*/
recv(clientSocket, buffer, 1024, 0);
/*---- Print the received message ----*/
printf("Data received: %s",buffer);
return 0;
}
output: