boost asio服务器端调用close后,客户端为啥还挂在接收函数中
boost asio服务器端调用close后,客户端为什么还挂在接收函数中?
先上代码
服务器端:
客户端:
如何才能关闭连接啊?
------解决方案--------------------
这个最好参考boost::asio 技术文档的介绍说明。
先上代码
服务器端:
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 技术文档的介绍说明。