Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Server code

#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;
}