Делаем boost :: asio :: ip :: tcp :: acceptor неблокирующим - PullRequest
1 голос
/ 23 февраля 2011

Я пытался создать своего рода неблокирующий TCP-сервер, используя tcp :: acceptor. Я делал это до того, как использовал BSD-сокеты и C (++), но не смог установить неблокирующий ввод-вывод с помощью boost.

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 ]

2 голосов
/ 23 февраля 2011

Использовать async_accept .

0 голосов
/ 24 февраля 2011

Поскольку я на самом деле занимаюсь рефакторингом старого кода 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( );
   }
}

Скажите мне, если вам нужно больше, если я могу это назвать, источника.

...