因此,假设我有一个客户端,并且要响应服务器消息,该客户端必须具有侦听它们的功能,例如在我的代码中:
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();
}
但是,使用它会使应用程序崩溃并出现错误。
有什么我想念的吗?预先感谢您的帮助!
答案 0 :(得分:0)
您应先关闭套接字,然后等待线程终止再关闭套接字。