Client server communication
1. The Server Code (server.cpp)
The server "listens" for an incoming connection. Once a client connects, it enters a loop where it first receives a message and then sends a response back.
C++
#include <iostream>
#include <string.h>
#ifdef _WIN32
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
#else
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define SOCKET int
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
#define closesocket close
#endif
int main() {
#ifdef _WIN32
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
#endif
SOCKET server_fd = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8080);
bind(server_fd, (struct sockaddr*)&address, sizeof(address));
listen(server_fd, 3);
std::cout << "Server listening on port 8080...\n";
SOCKET new_socket = accept(server_fd, NULL, NULL);
char buffer[1024] = {0};
const char* server_msg = "Hello from Server!";
// 1. Receive from Client
recv(new_socket, buffer, 1024, 0);
std::cout << "Client says: " << buffer << std::endl;
// 2. Send to Client
send(new_socket, server_msg, strlen(server_msg), 0);
std::cout << "Response sent.\n";
closesocket(new_socket);
closesocket(server_fd);
#ifdef _WIN32
WSACleanup();
#endif
return 0;
}
2. The Client Code (client.cpp)
The client initiates the connection. In this flow, it sends a message first and then waits for the server’s reply.
C++
#include <iostream>
#include <string.h>
#ifdef _WIN32
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
#else
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define SOCKET int
#define INVALID_SOCKET -1
#define closesocket close
#endif
int main() {
#ifdef _WIN32
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
#endif
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(8080);
// Use "127.0.0.1" for same machine, or server's IP for different machines
inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);
if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {
std::cout << "Connection Failed\n";
return -1;
}
const char* client_msg = "Hello from Client!";
char buffer[1024] = {0};
// 1. Send to Server
send(sock, client_msg, strlen(client_msg), 0);
std::cout << "Message sent to server.\n";
// 2. Receive from Server
recv(sock, buffer, 1024, 0);
std::cout << "Server replied: " << buffer << std::endl;
closesocket(sock);
#ifdef _WIN32
WSACleanup();
#endif
return 0;
}