Принятие сокета в C ++, который ведет себя по-разному в зависимости от потока, включает - PullRequest
0 голосов
/ 14 ноября 2018

Итак, я пытаюсь реализовать сервер-клиентскую систему на 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. Если я не включаю поток и мьютекс, остальная часть 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 Ответ

0 голосов
/ 14 ноября 2018

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

using namespace std;

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

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

...