【发布时间】:2013-10-25 09:32:51
【问题描述】:
我想使用 boost::asio 实现一个同步 tcp 客户端。
场景:
- 客户端:同步tcp客户端,循环发送数据到服务器
- 服务器:从客户端接收数据
当socket不可用时可以重建连接。
客户
io_service ios;
shared_ptr<socket> sp_sock(new socket(ios));
endpoint ep(address,port);
error_code ec;
sp_sock->connect(ep,ec);
if(ec)
{
return;
}
for(;;)
{
error_code ec;
boost::asio::write(*sp_sock,buffer("hello world"),ec);
if(ec)
{
reconnect_socket();
}
cout<<ec.message()<<endl;
sleep_for_a_while();
}
问题
客户端将连接到服务器,然后向服务器发送“hello world”。但是当我用“ctrl+c”关闭服务器时,问题就出现了:
写操作仍然有效,没有任何错误抛出,ec.message() = "success"。
多次写操作后,线程在写时永远被阻塞。
可能write函数将数据放入缓冲区,然后立即返回,当缓冲区满时写入阻塞?
一般来说,如何检查socket是否可写,或者服务器宕机时抛出错误,以便程序在服务器再次启动时尝试重建连接。
【问题讨论】:
-
检测对等方是否存活的唯一可靠的方法是在应用程序级别实现某种 ping 或心跳。
标签: c++ boost tcp boost-asio