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

发布于 2024-10-18 21:59:11 字数 518 浏览 5 评论 0原文

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

非常感谢!

I've been trying to make a non-blocking TCP server of sorts using tcp::acceptor. I've done this before using BSD sockets and C(++) but unable to set non blocking I/O using 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

And I need the equivalent under the TODO:

// reuse address

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

// TODO: set non blocking

// listen

m_Socket.listen( );

Much obliged!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

最终幸福 2024-10-25 21:59:11

由于我实际上正在重构旧的 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( );
   }
}

告诉我您是否需要更多(如果我可以称之为)源代码。

Since I'm actually refactoring old C++ code the accept() function (if could be set nonblocking) would fit quite nicely. I tried to avoid async functions due to the entire concept being unfamiliar to me:

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;
}

Is something like this possible (it succeeded with accept())? Basically I have a CTCPServer class which listens, if a connection is established, I make a CTCPSocket( io_service *, socket * ) which fails with "Bad file descriptor" (and it's not a problem in the io_service).

My test main:

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( );
   }
}

Tell me if you need more of the, if I can call it, source.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文