C++ Server-Client Communication from Scratch

Practical implementation, for theory please visit the small broken stationServer Code

#include <cstring>
#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h> // inet_pton function
#include <unistd.h>
#include <netinet/in.h>
using namespace std;

int main() {
    int server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd < 0) {
        cerr << "Socket creation failed\n";
        return -1;
    }
    sockaddr_in server_addr, client_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8080);
    server_addr.sin_addr.s_addr = INADDR_ANY; // Listen on all network interfaces
    socklen_t client_addr_len = sizeof(server_addr);
    int bfd = bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));
    if (bfd < 0) {
        cerr << "Bind failed\n";
        close(server_fd);
        return -1;
    }
    if (listen(server_fd, 3) < 0) {
        cerr << "Listen failed\n";
        close(server_fd);
        return -1;
    }
    cout << "Server is listening on port 8080...\n";
    int new_socket = accept(server_fd, (struct sockaddr*)&client_addr, &client_addr_len);
    if (new_socket < 0) {
        cerr << "Accept failed\n";
        close(server_fd);
        return -1;
    }
    cout << "Connection accepted from " << inet_ntoa(client_addr.sin_addr) << ":" << ntohs(client_addr.sin_port) << "\n"; // Convert binary IP to string and network byte order port to host integer
    // Read operation
    char buffer[1024] = {0};
    read(new_socket, buffer, sizeof(buffer));
    cout << "Message from client: " << buffer << endl;
    // Send operation
    // const char *response = "Hello from server";
    // send(new_socket, response, strlen(response), 0);
    // cout << "Response sent to client\n";
    // close(new_socket);
    // close(server_fd);
    return 0;
}

Client Code

#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h> // inet_pton function
#include <unistd.h>

int main() {
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0) {
        std::cerr << "Socket creation failed\n";
        return -1;
    }
    sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8080);
    inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);
    if (connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        std::cerr << "Connection to server failed\n";
        close(sock);
        return -1;
    }
    const char* message = "Hello from client";
    send(sock, message, sizeof(message), 0);
    std::cout << "Message sent to server\n";
    close(sock);
    return 0;
}

CMake Code

cmake_minimum_required(VERSION 3.10)
# Project name
project(SocketNewbie)
# Set C++ standard (recommended to use C++11 or higher for future use of smart pointers)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# --- Compile server ---
# add_executable(final executable name source code file)
add_executable(server Server.cpp)
# Uncomment the line below if using multithreading in the future
# target_link_libraries(server pthread)
# --- Compile client ---
add_executable(client Client.cpp)

Leave a Comment