我想使用 boost::asio 实现一个同步 tcp 客户端。
设想:
- client:同步tcp客户端,循环发送数据到服务器
- 服务器:从客户端接收数据
当套接字不可用时,可以重建连接。
客户
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是否可写,或者服务器宕机时抛出错误,以便程序可以在服务器再次启动时尝试重建连接。