2014-10-11 101 views
1

我想学习ASIO的提升,但我很难理解它。我想为应该可扩展和高性能的服务器制作基本布局。处理async_accept时不接受?

在下面的网址则存在一个小的TCP服务器设置一个例子: http://www.boost.org/doc/libs/1_42_0/doc/html/boost_asio/tutorial/tutdaytime3/src.html

我不明白的是以下部分:

void start_accept() 
{ 
tcp_connection::pointer new_connection = 
    tcp_connection::create(acceptor_.io_service()); 

acceptor_.async_accept(new_connection->socket(), 
    boost::bind(&tcp_server::handle_accept, this, new_connection, 
     boost::asio::placeholders::error)); 
} 

void handle_accept(tcp_connection::pointer new_connection, 
    const boost::system::error_code& error) 
{ 
    if (!error) 
    { 
    new_connection->start(); 
    start_accept(); 
    } 
} 

start_accept()最终调用async_accept ()在接收数据时调用它的处理函数。 处理程序在完成时调用start_accept()。

但是,如果客户端在处理程序仍在运行时尝试连接,会发生什么情况?是不是因为async_accept()不再被监听而无法处理请求?

如果我以错误的视角看待事情,我希望你能指引我正确的方向。

+1

[This](http://stackoverflow.com/a/15883510/1053968)答案试图强调状态和操作之间的区别,这在学习Boost.Asio时可能会有所帮助。 – 2014-10-11 17:33:28

回答

2

我想你注意到处理器发布一个新async_accept操作处理接受(new_connection->start())后:

void handle_accept(tcp_connection::pointer new_connection, 
    const boost::system::error_code& error) 
{ 
    if (!error) 
    { 
    new_connection->start(); // this posts connection specific asynch operations 
    start_accept();   // THIS POSTS THE ASYNC OPERATION AGAIN 
    } 
} 

你问是否有竞争条件有(其中新的异步接受未挂起在内核收到连接的确切时刻)。

没有这样的竞争,因为内核在TCP/IP堆栈实现中排队事件。


由于事实上,看看传统的select/poll/epoll方法,同样,当套接字状态发生改变,你没有得到一个异步信号。相反,您可以在自己的闲暇时间进行投票。

内核对待处理事件的时间,缓冲区大小和数量有一些限制,所以如果在某段时间内未能处理事件,它们可能会消失。

只要用户级代码不能直接控制原始硬件,那里就不会有竞争条件,因为OS栈必须将中断请求提取出来(否则你会调用该OS一个ExoKernel)。

+0

我有点明白你的意思!但我想你可能会误解我的问题(mayby,那是我的错误)。在start_accept()之前执行new_connection-> start()并不是真的,但更像是:只有在调用async_accept时才能接受连接。但async_accept只接受1连接权?因此,当处理程序运行时(即使new_connection-> start()是异步的,仍然有一点延迟吗?),直到它完成并且start_accept()再次调用并再次到达async_accept()时才能接受连接。 – 2014-10-11 15:07:58

+0

等待!我再次阅读你的答案,我完全明白你的意思。因此,操作系统会将网络消息保留一段时间,最终当它们不从队列中取出时,它们将被删除。这是正确的吗?所以,只要处理程序不会花费太长时间,那么小延迟并不重要。 (因此,我们可能需要处理线程的大反应吗?)作为最后一个问题!:你是否知道例如Windows和Linux平均可以存储多长时间?这是一个几秒或几毫秒的问题? – 2014-10-11 15:14:05

+0

@ChristianVeenman是的,所有代码最终在任何CPU上“顺序”运行。无论如何,没有两件事发生在同一时间,但没关系。无论如何,硬件无法同时到达两个数据包。有很多层缓冲来使其工作。你想要的是最小延迟。这是你得到的。 – sehe 2014-10-11 15:14:23