【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 ()
    
    


© 2025 by clayliu. All Rights Reserved.