#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main(void)
{
int socket_desc, client_sock, client_size;
struct sockaddr_in server_addr, client_addr;
char server_message[2000], client_message[2000];
/* Clean buffers and structures*/
memset(server_message, 0, sizeof(server_message));
memset(client_message, 0, sizeof(client_message));
memset(&server_addr, 0, sizeof(server_addr));
memset(&client_addr, 0, sizeof(client_addr));
/* Create socket */
socket_desc = socket(AF_INET, SOCK_STREAM, 0);
if(socket_desc < 0){
printf("[SERV] Error while creating socket\n");
return -1;
}
printf("[SERV] Socket created successfully\n");
/* Set port and IP that we'll be listening for, any other IP_SRC or port will be dropped */
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(2000);
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
/* Bind to the set port and IP */
if(bind(socket_desc, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
printf("[SERV] Couldn't bind to the port\n");
return -1;
}
printf("[SERV] Binding completed successfully\n");
/* Listen for clients */
if(listen(socket_desc, 1) < 0) {
printf("Error while listening\n");
return -1;
}
printf("[SERV] Start listening for incoming connections.....\n");
/* Accept an incoming connection from one of the clients */
client_size = sizeof(client_addr);
client_sock = accept(socket_desc, (struct sockaddr*)&client_addr, &client_size);
if (client_sock < 0){
printf("Can't accept\n");
return -1;
}
printf("[SERV] Client connected at IP: %s and port: %i\n",
inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
/* Receive message from clients. Note that we use client_sock, not socket_desc
Warning! Such usage does not guarantee that the message was received in full.
Also, two smaller messages might be (partly) received by the same recv() call.
MSG_WAITALL might me a solution for fixed size messages (in this example, they are not),
but it is blocking and bad things might happen due to a malicious or slow client.
*/
if (recv(client_sock, client_message, sizeof(client_message), 0) < 0){
printf("[SERV] Couldn't receive\n");
return -1;
}
printf("[SERV] Received message from client: %s\n", client_message);
/* Write a response to the client */
strcpy(server_message, "This is the server's message.");
if (send(client_sock, server_message, strlen(server_message), 0) < 0){
printf("[SERV] Can't send\n");
return -1;
}
/* Close the sockets */
close(client_sock);
close(socket_desc);
return 0;
}