【Cpp】使用winApi创建一个tcpServer
| 2 minute read | Using 260 words
使用winApi创建一个tcpServer
该 server ,每隔一秒法一条消息
#include <cstdio> #include <winsock2.h> #include <windows.h> #include <process.h> void HandleClient(void* clientSocket); int main() { WSADATA wsaData; SOCKET serverSocket, clientSocket; struct sockaddr_in serverAddr{}, clientAddr{}; int clientAddrLen = sizeof(clientAddr); int messageCounter = 1; // Initialize the message counter // Initialize Windsock if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { perror("WSAStartup failed"); return 1; } // Create socket serverSocket = socket(AF_INET, SOCK_STREAM, 0); if (serverSocket == INVALID_SOCKET) { perror("Failed to create socket"); WSACleanup(); return 1; } // Bind serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = INADDR_ANY; serverAddr.sin_port = htons(12345); if (bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { perror("Bind failed"); closesocket(serverSocket); WSACleanup(); return 1; } // Listen if (listen(serverSocket, 5) == SOCKET_ERROR) { perror("Listen failed"); closesocket(serverSocket); WSACleanup(); return 1; } printf("Server is listening on port 12345...\n"); while (1) { // Accept connection clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &clientAddrLen); if (clientSocket == INVALID_SOCKET) { perror("Accept failed"); closesocket(serverSocket); WSACleanup(); return 1; } // Create a new thread to handle the client _beginthread(HandleClient, 0, (void*)clientSocket); } closesocket(clientSocket); WSACleanup(); return 0; } void HandleClient(void* clientSocket) { auto socket = (SOCKET)clientSocket; int messageCounter = 1; while (1) { // Send message with an increasing number char message[50]; sprintf(message, "Message %d: Hello, client!\n", messageCounter); int bytesSent = send(socket, message, strlen(message), 0); if (bytesSent <= 0) { // Error or connection closed, close the client socket closesocket(socket); return; } printf("Message sent to client: %s", message); // Increment the message counter messageCounter++; Sleep(1000); } }
CmakeLists.txt
cmake_minimum_required(VERSION 3.26) project(test) set(CMAKE_CXX_STANDARD 17) add_executable(test main.cpp) # Link against the Winsock library (ws2_32.lib) on Windows if (WIN32) target_link_libraries(test wsock32 ws2_32) endif ()