【问题标题】:Making boost::asio::ip::tcp::acceptor non-blocking使 boost::asio::ip::tcp::acceptor 非阻塞
【发布时间】:2011-02-23 19:18:18
【问题描述】:

我一直在尝试使用 tcp::acceptor 创建一个非阻塞 TCP 服务器。我在使用 BSD 套接字和 C(++) 之前已经这样做了,但无法使用 boost 设置非阻塞 I/O。

C(++):

#ifdef WIN32
  int mode = 1;
  ioctlsocket(Socket, FIONBIO, (u_long FAR *) &mode);
#else
  fcntl(Socket, F_SETFL, fcntl(Socket, F_GETFL) | O_NONBLOCK);
#endif

我需要 TODO 下的等价物:

// reuse address

m_Socket.set_option( boost::asio::socket_base::reuse_address( true ) );

// TODO: set non blocking

// listen

m_Socket.listen( );

非常感谢!

【问题讨论】:

  • 简单地使用 acceptor::async_accept() ?还是我错过了什么?

标签: c++ sockets boost-asio nonblocking


【解决方案1】:

使用async_accept

【讨论】:

    【解决方案2】:

    因为我实际上是在重构旧的 C++ 代码,所以 accept() 函数(如果可以设置为非阻塞)将非常适合。由于我不熟悉整个概念,我试图避免使用异步函数:

    tcp::socket *CTCPServer :: AsyncAccept( )
    {
      tcp::socket *Socket = new tcp::socket( *m_Service );
      m_Socket.async_accept( *Socket, endpoint, boost::bind( &CTCPServer::HandleAccept, this ) );
    
      return Socket;
    }
    

    这样的事情可能吗(通过 accept() 成功了)?基本上我有一个 CTCPServer 类来监听,如果建立了连接,我会创建一个 CTCPSocket( io_service *, socket * ),它会因“错误的文件描述符”而失败(这在 io_service 中不是问题)。

    我的测试主要:

    tcp::socket *Socket;
    CTCPServer Server( &io_service, 6667 );
    
    while( true )
    {
      if( ( Socket = Server.AsyncAccept( ) ) )
      {
        CTCPSocket TCPSocket( &io_service, Socket ); // fails
        TCPSocket.PutBytes( "stack overflow" );
        TCPSocket.DoSend( );
       }
    }
    

    如果您需要更多,请告诉我,如果我可以调用它,来源。

    【讨论】:

    • 这应该是另一个问题,而不是您自己问题的答案。请删除它并提出一个新问题。
    • 您错过了 async_accept 的要点。 @Sam 是对的,请发布另一个问题或修改此问题,以适当者为准。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多