Делаю небольшой мессенджер (протокол TCP). Есть сервер и клиент. Уже почти все написал, но решил принятие пакетов на клиенте убрать в отдельный поток и запихивать все пакеты в очередь.
Вот его небольшой кусок:
client->getSocketSelector()->add(*client->getSocket());
while (client->isRun()) {
m_conditionHandling.wait(handler_lock, [this]() { return m_isRun; });
if (client->getSocketSelector()->wait(sf::seconds(1))) {
if (client->getSocketSelector()->isReady(*client->getSocket())) {
sf::Packet packet;
m_status = client->getSocket()->receive(packet);
if (m_status == sf::Socket::Done) {
queue.push(packet);
//...
}
}
}
}
(m_conditionHandling
нужен, чтобы запускать этот поток только после подключения к серверу socket.connect()
и тормозить, если отсоединился от сервера)
Сначала я отправляю серверу запрос на выдачу информации о нем
getSocket()->send(packet);
И рассчитываю на то, что мне придет ответ от сервера. На сервере видно, что от клиента пришел пакет, сервер создает пакет с данными о нем и его благополучно отправляет и выдает sf::Status::Done
,
но вот функция
client->getSocketSelector()->wait(sf::seconds(1))
никак не реагирует и остается false
, мало того, она не ждет 1 секунду. Так еще если я убираю этот timeout
, то функция так же не блокирует выполнения, а благополучно выходит из if(), хотя в документации написано, что по умолчанию timeout = sf::Time::Zero
и эта функция будет ждать бесконечно пакет.
В чем может быть проблема? Что я не так делаю?
Заранее благодарю!
Нашел решение. добавил в SocketSelector
сокет клиента уже после подключения к серверу и заработало.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Как можно русифицировать инструменты разработчика (Dev Tools) в браузере Chrome?
Нужно считать целые числа, среди них есть записанные в экспоненциальном виде, есть ли способ их пометить как не правильные и пропустить, без...