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