使boost :: asio :: ip :: tcp :: acceptor非阻塞

时间:2011-02-23 19:18:18

标签: c++ sockets boost-asio nonblocking

我一直在尝试使用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( );

非常有责任!

2 个答案:

答案 0 :(得分:2)

使用async_accept

答案 1 :(得分:0)

由于我实际上正在重构旧的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 *)失败并显示“Bad file descriptor”(这在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( );
   }
}

如果我需要更多,请告诉我,如果我可以打电话,请来源。