SFML SocketSelector::wait() некорректно работает

233
04 июля 2017, 23:06

Делаю небольшой мессенджер (протокол 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 и эта функция будет ждать бесконечно пакет.

В чем может быть проблема? Что я не так делаю?

Заранее благодарю!

Answer 1

Нашел решение. добавил в SocketSelector сокет клиента уже после подключения к серверу и заработало.

READ ALSO
Возможно ли русифицировать Dev Tools Chrome?

Возможно ли русифицировать Dev Tools Chrome?

Как можно русифицировать инструменты разработчика (Dev Tools) в браузере Chrome?

302
Ошибка компилятора C++

Ошибка компилятора C++

Ошибка C1091 ограничение компилятора: длина строки превышает 65535 байт

289
Ввод в экспоненциальной форме записи

Ввод в экспоненциальной форме записи

Нужно считать целые числа, среди них есть записанные в экспоненциальном виде, есть ли способ их пометить как не правильные и пропустить, без...

233