C++多线程服务器

C++ multi threaded server

本文关键字:服务器 多线程 C++      更新时间:2023-10-16

我正在处理一个服务器,它只连接一个客户端并发回他们键入的内容。到目前为止,它运行良好,但我想让它成为多线程的,这样我就可以连接更多的客户端,这样他们就可以"说话"。你们能给我推荐任何源代码,我可以查看这些源代码来对我自己的代码进行一些调整吗?谢谢。我也希望这在不同的网络上工作,我不确定如何做到这一点,所以一些源代码也可以工作。另外,我在八年级,没有太多经验,所以一个解释清楚的答案将不胜感激。

int main() {
    WSADATA wsaData;
    // Initialize Winsock
    int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if(iResult != 0)
    {
        printf("WSAStartup failed: %dn", iResult);
        return 1;
    }
    struct addrinfo *result = NULL,
                    hints;
    ZeroMemory(&hints, sizeof(hints));
    hints.ai_family = AF_INET;      // Internet address family is unspecified so that either an IPv6 or IPv4 address can be returned
    hints.ai_socktype = SOCK_STREAM;    // Requests the socket type to be a stream socket for the TCP protocol
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;
    // Resolve the local address and port to be used by the server
    iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
    if (iResult != 0)
    {
        printf("getaddrinfo failed: %dn", iResult);
        WSACleanup();
        return 1;
    }
    SOCKET ListenSocket = INVALID_SOCKET;
    // Create a SOCKET for the server to listen for client connections
    ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
    if (ListenSocket == INVALID_SOCKET)
    {
        printf("Error at socket(): %dn", WSAGetLastError());
        freeaddrinfo(result);
        WSACleanup();
        return 1;
    }
    // Setup the TCP listening socket
    iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen);
    if (iResult == SOCKET_ERROR)
    {
        printf("bind failed: %d", WSAGetLastError());
        freeaddrinfo(result);
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    freeaddrinfo(result);
    // To listen on a socket
    if ( listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR)
    {
        printf("listen failed: %dn", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    SOCKET ClientSocket;
    ClientSocket = INVALID_SOCKET;
    // Accept a client socket
    ClientSocket = accept(ListenSocket, NULL, NULL);
    if (ClientSocket == INVALID_SOCKET)
    {
        printf("accept failed: %dn", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    char recvbuf[DEFAULT_BUFFER_LENGTH];
    int iSendResult;
    // reveice until the client shutdown the connection
    do {
        iResult = recv(ClientSocket, recvbuf, DEFAULT_BUFFER_LENGTH, 0);
        if (iResult > 0)
        {
            char msg[DEFAULT_BUFFER_LENGTH];
            memset(&msg, 0, sizeof(msg));
            strncpy(msg, recvbuf, iResult);
            printf("Received: %sn", msg);
            iSendResult = send(ClientSocket, recvbuf, iResult, 0);
            if (iSendResult == SOCKET_ERROR)
            {
                printf("send failed: %dn", WSAGetLastError());
                closesocket(ClientSocket);
                WSACleanup();
                return 1;
            }
            printf("Bytes sent: %ldn", iSendResult);
        }
        else if (iResult == 0)
            printf("Connection closedn");
        else
        {
            printf("recv failed: %dn", WSAGetLastError());
            closesocket(ClientSocket);
            WSACleanup();
            //return 1;
        }
    } while (iResult > 0);
    // Free the resouces
    closesocket(ListenSocket);
    WSACleanup();
    getchar();
    return 0;
}

有几十种方法可以实现此解决方案。

首先,最好设计哪种方法更适合您的教育目的。

考虑网络编程:

我可以推荐的网络编程的最佳指南之一是Beej的指南。

考虑服务器端体系结构:

我想推荐 C++ Anthony Williams 的 Concurrency in Action: Practical Multithreading 以供进一步阅读。

在你面前,一整片可能性的海洋 - 去吧!

Ps:考虑这样的一般问题

最好在软件工程论坛中寻找此类问题的答案。