1

boost::asio::tcp::socket用来连接到服务器,并调用 read_some()从服务器接收二进制数据,以下是代码:

len = sock->read_some(boost::asio::buffer(pBuf), error);

if (error == boost::asio::error::eof) {

    break;

}

else if (error) {

    break;

}

但是在服务端关闭套接字后,客户端仍然阻塞在 read_some 方法中,未能检测到与服务端的断开连接并收到错误消息。为什么会出现这个问题?

4

1 回答 1

2

这要么是因为您未能正确实现在 TCP 之上使用的协议,要么是因为该协议中的设计缺陷。如果协议说永远等待来自服务器的数据而不发送任何东西,那么故障就在协议中。如果协议说要超时读取或发送一些数据而您没有这样做,那么缺陷在于您的协议实现。

TCP 不保证未尝试发送任何数据的一方可以检测到连接丢失。使用 TCP 的协议必须围绕这一点进行设计。

于 2012-08-24T02:27:31.493 回答