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)