@NeoLight2

Функция accept(); не блокирует код, в C++, что делать?

Хочу написать простенький TCP сервер на C++, чтобы он в одном потоке слушал подключения к нему, а потом под каждого нового клиента выделял новый поток.
Я написал подобный код:
void startServer() {

    int wsaStatus; 
    WSADATA WSAData;
    wsaStatus = WSAStartup(MAKEWORD(2, 0), &WSAData);
    if (wsaStatus != NO_ERROR) {
        cout << "WSA Startup failed with error : " << wsaStatus;
    }

    SOCKET sock; 
    SOCKADDR_IN sin; 

    sin.sin_addr.s_addr = htonl(INADDR_ANY);
    sin.sin_family = AF_INET; 
    sin.sin_port = htons(1234); 
    sock = socket(AF_INET, SOCK_STREAM, 0); 
    if (sock == INVALID_SOCKET) {
        std::cout << "INVALID SOCKET " << WSAGetLastError();
        WSACleanup();
    }

    bind(sock, (SOCKADDR*)&sin, sizeof(sin)); 

    listen(sock, 1000);
    while (true)
    {
        
        int sizeof_sin = sizeof(sin); 
        sock = accept(sock, (SOCKADDR*)&sin, &sizeof_sin); 
        thread clientThread(serveClient, sock); //под каждого нового клиента выделяю новый поток
        clientThread.detach();
        cout << "CONNECTION ESTABLISHED!" << endl;
        
    }


    WSACleanup();
}


А вот код функции которая обрабатывает каждого клиента:
void serveClient(SOCKET socket) {
    char buffer[255];
    if (socket != INVALID_SOCKET)
    {
        recv(socket, buffer, sizeof(buffer), 0);
        closesocket(socket);
        std::cout << buffer << std::endl;
    }
    else {
        closesocket(socket);
    }
}

Но по какой то причине функция accept() не хочет задерживать код, до того времени как подключиться клиент, а просто проигрывается в цикле без дожидания клиента (
Где я допустил ошибку ?
  • Вопрос задан
  • 182 просмотра
Пригласить эксперта
Ответы на вопрос 1
Надо проверять, что возвращает accept на предмет ошибки.
https://docs.microsoft.com/en-us/windows/win32/api...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы