C++ Socket Server and Client Example: Simple Communication
C++ Socket Server and Client Example: Simple Communication
This code demonstrates a basic C++ socket server and client implementation. The server listens on a specified port, accepts client connections, and sends a welcome message. The client connects to the server, receives the message, and displays it.
Server Code:
#include <iostream>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
int main()
{
WSADATA wsaData;
SOCKET serverSocket, clientSocket;
SOCKADDR_IN serverAddr, clientAddr;
int iRet, addrLen = sizeof(SOCKADDR_IN);
// Initialize Winsock
iRet = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iRet != NO_ERROR) {
std::cerr << "Error: WSAStartup failed with error code " << iRet << std::endl;
return -1;
}
// Create server socket
serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (serverSocket == INVALID_SOCKET) {
std::cerr << "Error: Failed to create server socket with error code " << WSAGetLastError() << std::endl;
WSACleanup();
return -1;
}
// Bind server socket to specified port
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = INADDR_ANY;
serverAddr.sin_port = htons(12345);
iRet = bind(serverSocket, (SOCKADDR*)&serverAddr, sizeof(SOCKADDR_IN));
if (iRet == SOCKET_ERROR) {
std::cerr << "Error: Failed to bind server socket with error code " << WSAGetLastError() << std::endl;
closesocket(serverSocket);
WSACleanup();
return -1;
}
// Start listening for client requests
iRet = listen(serverSocket, SOMAXCONN);
if (iRet == SOCKET_ERROR) {
std::cerr << "Error: Failed to listen on server socket with error code " << WSAGetLastError() << std::endl;
closesocket(serverSocket);
WSACleanup();
return -1;
}
std::cout << "Server started and listening on port 12345..." << std::endl;
// Wait for client connection request
clientSocket = accept(serverSocket, (SOCKADDR*)&clientAddr, &addrLen);
if (clientSocket == INVALID_SOCKET) {
std::cerr << "Error: Failed to accept client connection with error code " << WSAGetLastError() << std::endl;
closesocket(serverSocket);
WSACleanup();
return -1;
}
std::cout << "Client connected from " << inet_ntoa(clientAddr.sin_addr) << ":" << ntohs(clientAddr.sin_port) << std::endl;
// Send welcome message to client
const char* welcomeMsg = "Welcome to my server!";
iRet = send(clientSocket, welcomeMsg, strlen(welcomeMsg), 0);
if (iRet == SOCKET_ERROR) {
std::cerr << "Error: Failed to send welcome message with error code " << WSAGetLastError() << std::endl;
closesocket(clientSocket);
closesocket(serverSocket);
WSACleanup();
return -1;
}
// Close sockets and release resources
closesocket(clientSocket);
closesocket(serverSocket);
WSACleanup();
return 0;
}
Client Code:
#include <iostream>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
int main()
{
WSADATA wsaData;
SOCKET clientSocket;
SOCKADDR_IN serverAddr;
char recvBuf[1024] = { 0 };
int iRet;
// Initialize Winsock
iRet = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iRet != NO_ERROR) {
std::cerr << "Error: WSAStartup failed with error code " << iRet << std::endl;
return -1;
}
// Create client socket
clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (clientSocket == INVALID_SOCKET) {
std::cerr << "Error: Failed to create client socket with error code " << WSAGetLastError() << std::endl;
WSACleanup();
return -1;
}
// Specify server address and port
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // Server IP address
serverAddr.sin_port = htons(12345); // Server port number
// Connect to server
iRet = connect(clientSocket, (SOCKADDR*)&serverAddr, sizeof(SOCKADDR_IN));
if (iRet == SOCKET_ERROR) {
std::cerr << "Error: Failed to connect to server with error code " << WSAGetLastError() << std::endl;
closesocket(clientSocket);
WSACleanup();
return -1;
}
// Receive welcome message from server
iRet = recv(clientSocket, recvBuf, sizeof(recvBuf), 0);
if (iRet == SOCKET_ERROR) {
std::cerr << "Error: Failed to receive welcome message with error code " << WSAGetLastError() << std::endl;
closesocket(clientSocket);
WSACleanup();
return -1;
}
std::cout << "Server said: " << recvBuf << std::endl;
// Close socket and release resources
closesocket(clientSocket);
WSACleanup();
return 0;
}
原文地址: https://www.cveoy.top/t/topic/nojT 著作权归作者所有。请勿转载和采集!