我一直在尝试使用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( );
非常有责任!
答案 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( );
}
}
如果我需要更多,请告诉我,如果我可以打电话,请来源。