boost asio服务器端调用close后,客户端为啥还挂在接收函数中

boost asio服务器端调用close后,客户端为什么还挂在接收函数中?
先上代码
服务器端:

class server
{
private:
io_service &ios;
ip::tcp::acceptor acc;
typedef boost::shared_ptr<ip::tcp::socket> sock_pt;

public:
server(io_service &io)
:ios(io),
acc(ios, ip::tcp::endpoint(ip::tcp::v4(), 6688))
{
start();
}

void start()
{
sock_pt sock(new ip::tcp::socket(ios));
acc.async_accept(*sock, 
boost::bind(&server::accept_handler, this, placeholders::error, sock));
}

void accept_handler(const boost::system::error_code &ec, sock_pt sock)
{
if (ec)
{
std::cout << boost::system::system_error(ec).what() << std::endl;
return ;
}
cout<<"client:"<<sock->remote_endpoint().address() <<endl;
sock->async_write_some(buffer("hello asio",5),
bind(&server::write_handler, this, placeholders::error, sock));
start();
sock.reset();
}

void write_handler(const boost::system::error_code  &ec, sock_pt sock)
{
cout<<"send msg complete."<<endl;
sock->close();//此处已经调用了关闭连接,但客户端还是挂在接收函数中不出来
int df = sock.use_count();
sock.reset();
df = sock.use_count();

}
};

void thfun(io_service &ios)
{
while (1)
{
ios.run();
}
}

void asynctest()
{

try
{
cout<<"server start"<<endl;
io_service ios;
server serv(ios);

boost::thread thrd1(&thfun,boost::ref(ios));
boost::thread thrd2(&thfun,boost::ref(ios));
boost::thread thrd3(&thfun,boost::ref(ios));
boost::thread thrd4(&thfun,boost::ref(ios));

system("pause");
}
catch (std::exception &e)
{
cout<< e.what()<<endl;
}
}

int _tmain(int argc, _TCHAR* argv[])
{
asynctest();
//TCPclient();
system("pause");
return 0;
}



客户端:

//TCP客户端
void TCPclient()
{
try
{
cout<< "client start."<<endl;
io_service ios;//asio程序必须要用到此对象
ip::tcp::socket sock(ios);
ip::tcp::endpoint ep(ip::address::from_string("127.0.0.1"), 6688);

sock.connect(ep);

while (1)
{
char str[1024] = {0};
boost::system::error_code ec;
sock.read_some(buffer(str), ec);//服务端close后还在此处挂着,服务器进程必须关闭,他才进入下面的if
if (ec)
{
std::cout << boost::system::system_error(ec).what() << std::endl; 
break;
}
cout<<"recive from:"<<sock.remote_endpoint().address();
cout<<str<<endl;
}

sock.close();
}
catch (std::exception& e)
{
cout <<e.what()<<endl;
}
return;
}

int _tmain(int argc, _TCHAR* argv[])
{
TCPclient();
system("pause");
return 0;
}


如何才能关闭连接啊?
------解决方案--------------------
这个最好参考boost::asio  技术文档的介绍说明。