改进服务器以处理多个客户端

时间:2014-12-27 20:54:25

标签: c++ multithreading server

我正在尝试创建一个与2个客户端通信的服务器,每次1个。与一个客户端通话后,服务器向两个客户端发送消息。 我发现了一个服务器的基本代码,我试图升级它以接受多个连接,我看到了两种方式:线程,或者做插座数组,但我无法理解它。 有人可以解释我如何使用线程并提供示例吗? 这是代码:

int main()
{
    WSADATA WsaDat;
    if (WSAStartup(MAKEWORD(2, 2), &WsaDat) != 0)
    {
        std::cout << "WSA Initialization failed!\r\n";
        WSACleanup();
        system("PAUSE");
        return 0;
    }

    SOCKET Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (Socket == INVALID_SOCKET)
    {
        std::cout << "Socket creation failed.\r\n";
        WSACleanup();
        system("PAUSE");
        return 0;
    }

    SOCKADDR_IN serverInf;
    serverInf.sin_family = AF_INET;
    serverInf.sin_addr.s_addr = INADDR_ANY;
    serverInf.sin_port = htons(8888);

    if (bind(Socket, (SOCKADDR*)(&serverInf), sizeof(serverInf)) == SOCKET_ERROR)
    {
        std::cout << "Unable to bind socket!\r\n";
        WSACleanup();
        system("PAUSE");
        return 0;
    }

    listen(Socket, 1);

    SOCKET TempSock = SOCKET_ERROR;
    while (TempSock == SOCKET_ERROR)
    {
        std::cout << "Waiting for incoming connections...\r\n";
        TempSock = accept(Socket, NULL, NULL);
    }

    // If iMode!=0, non-blocking mode is enabled.
    u_long iMode = 1;
    ioctlsocket(Socket, FIONBIO, &iMode);

    Socket = TempSock;
    std::cout << "Client connected!\r\n\r\n";

    // Main loop
    for (;;)
    {
        char *szMessage = "Welcome to the server!\r\n";
        send(Socket, szMessage, strlen(szMessage), 0);

        int nError = WSAGetLastError();
        if (nError != WSAEWOULDBLOCK&&nError != 0)
        {
            std::cout << "Winsock error code: " << nError << "\r\n";
            std::cout << "Client disconnected!\r\n";

            // Shutdown our socket
            shutdown(Socket, SD_SEND);

            // Close our socket entirely
            closesocket(Socket);

            break;
        }

        Sleep(1000);
    }

    WSACleanup();
    system("PAUSE");
    return 0;
}

1 个答案:

答案 0 :(得分:0)

为此,您需要一个服务器套接字和 clientsocket array ,如下所示:

SERVER:

ACCEPT:
int clientsock[2];
minsocks = 0;
numsocks = 2;
while(minsock < numsocks)
{
    clientsock[minsock] = accept(serversock,
    (struct sockaddr *) &clientaddr,
    (socklen_t *)&clientaddrlen);
    minsock++;
}


RECIEVE:


char message[6];
int data;
int limit = 6;
for(int i = 0; i < NUMSOCK; i++)
{
    int in = recv(clientsock[i], &message[index], limit, 0);
    if(in > 0)
    {
        index += in;
        limit -= in;
    }
    else if ( in == 0 )
        printf("Connection closed\n");
    else
        printf("recv failed: %d\n", WSAGetLastError());
}

这应该是一个很好的开始。

主题 - C版

pthread_t sniffer_thread;
if( pthread_create( &sniffer_thread , NULL ,  connection_handler , (void*) new_sock) < 0)
    {
        perror("could not create thread");
        return 1;
    }

    //Now join the thread , so that we dont terminate before the thread
    //pthread_join( sniffer_thread , NULL);
    puts("Handler assigned");
 }

/*
 * This will handle connection for each client
 * */
void *connection_handler(void *socket_desc)
{
    //Get the socket descriptor
    int sock = *(int*)socket_desc;
    int read_size;
    char *message , client_message[2000];
    while(in != 0)
    {
        int in = recv(socket_desc, &client_message[index], limit, 0);
        if(in > 0)
        {
             index += in;
             limit -= in;
        }
        else
            printf("recv failed: %d\n", WSAGetLastError());   
    }
    //Free the socket pointer
    free(socket_desc);

    return 0;
}