使 boost::asio::ip::tcp::acceptor 非阻塞
我一直在尝试使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
使用async_accept。
Use async_accept.
由于我实际上正在重构旧的 C++ 代码,accept() 函数(如果可以设置为非阻塞)将非常适合。我试图避免异步函数,因为整个概念对我来说并不熟悉:
这样的事情可能吗(它通过accept()成功了)?基本上我有一个 CTCPServer 类来监听,如果建立了连接,我会创建一个 CTCPSocket( io_service *, socket * ),它会因“错误文件描述符”而失败(这不是 io_service 中的问题)。
我的测试主要:
告诉我您是否需要更多(如果我可以称之为)源代码。
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:
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:
Tell me if you need more of the, if I can call it, source.