实施断开连接功能

时间:2019-01-17 19:47:38

标签: c++ multithreading boost-asio

因此,假设我有一个客户端,并且要响应服务器消息,该客户端必须具有侦听它们的功能,例如在我的代码中:

int Client::loop(void *data)
{
Client *instance = (Client*)data;
for (;;)
{
    boost::array<unsigned char, PACKET_LENGTH> buf;
    boost::system::error_code error;
    // Read any incoming package
    size_t len = instance->socket.read_some(boost::asio::buffer(buf), error);

    if (error == boost::asio::error::eof)
    {
        // Connection closed, return
        return 0;
    }

    DataHeader header = static_cast<DataHeader>(buf[0]);

    switch (header) // Let's see which type of packet the server is sending.
    {
        case GTREG: // Server is sending a GTREG response.
            instance->getRegionResponse(buf);
            break;
        case PLOBJ: // Server is sending a PLOBJ response.
            instance->placeObjResponse(buf);
            break;
        case MOVPL: // WIP.
            break;
        case SYOBJ: // Server is sending an object that other player placed.
            instance->syncObj(buf);
            break;
        default:
            break;
    }
}
}

此功能由SDL制成线程,因此程序的主进程可以执行工作而不必侦听服务器。现在,在某个时间点,我将要关闭程序,并且必须断开监听套接字的连接。

此“关闭函数”由程序的主进程调用,因此它需要以某种方式告诉客户端线程在关闭之前先关闭。

现在,我该怎么做?我已经尝试过这样的功能:

void Client::disconnect()
{
    boost::system::error_code error;
    socket.shutdown(boost::asio::ip::tcp::socket::shutdown_both, error);
    socket.close();
}

但是,使用它会使应用程序崩溃并出现错误。

有什么我想念的吗?预先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您应先关闭套接字,然后等待线程终止再关闭套接字。