1

我想使用 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是否可写,或者服务器宕机时抛出错误,以便程序可以在服务器再次启动时尝试重建连接。

4

1 回答 1

0

您的客户端代码没有任何问题,它的行为正确,因为 TCP 套接字实现了字节流的可靠按顺序传递。您的客户端没有意识到服务器没有响应,因为这不是一项简单的任务,您的客户端和服务器应用程序之间有许多实体。

您可能希望启用TCP keep alive。尽管它也不是灵丹妙药,但要小心,它只是表明两端的 TCP 堆栈还活着;这没有说明应用程序的可用性。为所有环境配置各种 timeous 也有些棘手。

最灵活的选择是在您的客户端和服务器中实现心跳协议,该协议可以完全适应您的应用程序的性能要求。

于 2013-10-25T17:53:46.313 回答