Поэтому я пытаюсь реализовать систему сервер-клиент на C ++ 17, которая также использует многопоточность для работы с клиентами. До сих пор мне удалось реализовать его базовый планировщик с использованием Winsock2 для соединений с сервером и конкретных потоков Windows (CreateThread (...) и т. Д.). И работает нормально.

Хотя, поскольку C ++ 11 реализовал свои собственные потоки, и мы хотим иметь возможность запускать систему и в Linux, я решил реализовать потоки таким образом, поэтому у меня нет проблем, связанных с поссиксом.

Но в значительной степени это испортило мою вещь, и я не знаю, как это исправить. (обратите внимание, что в настоящее время я пробую это на локальном сервере, причем и «сервер», и «клиент» работают на одном компьютере).

Итак, изначально система выглядела примерно так:

//set up connection / server details
while(true){
    newConnection = accept(sListen, (SOCKADDR*)&addr, &addrlen);
    if (newConnection == 0)
        {
         std::cout<<"Failed to accept the client's connection."" <<std::endl;
        }
        else
        {
        CreateThread(...);
        }
}

Проблема в том, что если я включу поток или мьютекс, newConnection будет принимать соединение 24/7, даже если его нет, и всегда будет входить в другое из if. Если я не включаю поток и мьютекс, то else из if будет активирован только тогда, когда клиент подключается к серверу.

Есть идеи, как я могу это исправить или что может вызвать эту проблему?

Ура

РЕДАКТИРОВАТЬ :

SOCKADDR_IN addr;
int addrlen = sizeof(addr); 

inet_pton(AF_INET, "127.0.0.1", &ip_address);
addr.sin_addr.s_addr = ip_address;
addr.sin_port = htons(1111); //Port
addr.sin_family = AF_INET; //IPv4 Socket

SOCKET sListen = socket(AF_INET, SOCK_STREAM, NULL); 
bind(sListen, (SOCKADDR*)&addr, sizeof(addr)); 
listen(sListen, SOMAXCONN);

РЕДАКТИРОВАТЬ 2: Я думаю, проблема в том, что если я не включаю <thread> или <mutex>, accept фактически ожидает подключения клиента, прежде чем продолжить, а если я его включу, он просто вернет INVALID_SOCKET, который кажется равным к 4294967295.

1
Bumblebee 14 Ноя 2018 в 15:38

1 ответ

Лучший ответ

Большинство реализаций заголовка thread будут включать (прямо или иначе) заголовок functional. В этом заголовке объявляется std::bind. К сожалению, если у вас также есть ...

using namespace std;

Тогда есть шанс, что std::bind будет предпочтительнее интересующей вас сети bind.

См. Также Почему «использование пространства имен std» считается плохой практикой? .

5
G.M. 14 Ноя 2018 в 14:05