c++ - Boost.Asio 套接字被阻止

标签 c++ boost boost-asio

main.cpp 中的 for 循环调用了一个使用 boost::mutex 并使用 read_until 从套接字读取的函数,它只运行一次,之后就好像被阻塞了。我试过在右括号之前放一个 continue 然后它崩溃了。这可能与线程有关。

// MAIN.CPP

int main(int argc, char* argv[])
{   
    std::cout << "Enter port number: ";
    std::string port;
    std::getline(std::cin, port);
    int tempPort = std::stoi(port);
    Network * network = new Network(tempPort);

    int it = 0;
    boost::thread * t1;
    t1 = new boost::thread([&network, &it]
    {
        while (true)
        {
            boost::asio::ip::tcp::socket * sock = new boost::asio::ip::tcp::socket(network->io_service);
            network->accept(*sock);

            if (network->socketList.size() > 0)
            {
                for (boost::asio::ip::tcp::socket * s : network->socketList)
                {
                    if (s->remote_endpoint().address().to_string() == sock->remote_endpoint().address().to_string())
                    {
                        continue;
                    }
                    else {
                        network->socketList.push_back(sock);
                        std::cout << s->remote_endpoint().address().to_string() << " connected." << std::endl;
                    }
                }
            }
            else {
                network->socketList.push_back(sock);
                std::cout << sock->remote_endpoint().address().to_string() << " connected." << std::endl;
            }
        }
    });

    while (true)
    {
        for (boost::asio::ip::tcp::socket * sock : network->socketList)
        {
            std::cout << "on range-based for loop" << std::endl;
            network->readChatMessage(*(sock));
        }
    }
    t1->join();

    return 0;
}

// NETWORK.CPP
int Network::sendChatMessage(boost::asio::ip::tcp::socket & socket, ChatMessage & message)
{
    try
    {
        boost::system::error_code err;

        boost::asio::streambuf buf;
        {
            std::ostream out(&buf);
            boost::archive::text_oarchive oa(out);
            oa & message;

            std::cout << std::string(message.text.begin(), message.text.end()) << std::endl;
        }

        m.lock();
        write(socket, buf, err);

        if (err)
        {
            std::cout << err.message() << std::endl;
        }

        m.unlock();

        std::cout << "Mensagem enviada com sucesso!" << std::endl;
    }
    catch (std::exception& e)
    {
        std::cout << e.what() << std::endl;
    }

    return 0;
}

int Network::readChatMessage(boost::asio::ip::tcp::socket & socket)
{
    std::cout << "in readChatMessage()" << std::endl;

    boost::system::error_code err;

    boost::asio::streambuf buf;

    m.lock();
    boost::asio::read_until(socket, buf, '\0', err);

    if (err)
    {
        std::cout << err.message() << std::endl;
    }

    m.unlock();

    std::istream in(&buf);
    ChatMessage message;

    boost::archive::text_iarchive ia(in);
    ia & message;

    std::cout << std::string(message.text.begin(), message.text.end()) << std::endl;
    this->sendChatMessage(socket, message);

    return 0;
}

最佳答案

在稍微调试和编辑代码后我能够解决问题,然后我能够看到发生错误:input stream error 由于序列化输入/输出。我正确地处理了错误,在错误发生时解锁了互斥量并且没有让互斥量撤消。

片段:

int Network::readChatMessage(boost::asio::ip::tcp::socket & socket)
{
    std::cout << "in readChatMessage()" << std::endl;

    boost::system::error_code err;

    boost::asio::streambuf buf;

    m.lock();
    boost::asio::read_until(socket, buf, '\0', err);

    if (err)
    {
        m.unlock();
        std::cout << err.message() << std::endl;
        return 0;
    }
    else {

        m.unlock();

        std::istream in(&buf);
        ChatMessage message;

        boost::archive::text_iarchive ia(in);
        ia & message;

        std::cout << std::string(message.text.begin(), message.text.end()) << std::endl;
        this->sendChatMessage(socket, message);
        return 0;
    } 
    m.unlock();

    return 0;
}

关于c++ - Boost.Asio 套接字被阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37398505/

相关文章:

c++ - 为什么在 C++ 中可以将任意数量的预递增/递减运算符放在一起?

c++ - 如何使用 STL 和/或 Boost 在 C++ 中模拟 SQL 连接

c++ - 如何制作解析指针的存档?

c++ - boost::asio::streambuf::consume - 注入(inject)垃圾字符

c++ - 这种 rebind_alloc 的使用是错误的吗?

c++ - 没有参数列表时模板名称 ‘boost::asio::strand’ 的使用无效

c++ - 无法将 ncurses 与 Qt 链接

c++ - 64 位环境中引用的大小

c++ - 如何在不使用 std::string 或任何 STL 的情况下将复数存储在 C++ 的字符数组中?

c++ - 将标记转换为 char* const* 时,使用 boost 对字符串进行标记失败