请问用Acceptor建立的socket是阻塞的还是非阻塞的?
在用Acceptor模式的时候,当监听到客户的连接请求时,Acceptor会在底层建立一个与客户端的socket连接。我想问问这个socket是阻塞的还是非阻塞的。可以通过 Acceptor设定底层socket的阻塞模式吗? 不过我猜Acceptor生成的socket的属性,应该是继承自Acceptor的,也就是说Accptor如果是阻塞模式的话,生成的socket也应该是阻塞的。这个应该是和调用accept()系统调用的结果是一致的。但是我不知道怎么设置Acceptor的模式,我只是听说可以通过ACE_Sock_Stream的enable()方法设置模式。 看看源码不就知道了..默认是非阻塞的
// Set the peer acceptor's handle into non-blocking mode.This is a
// safe-guard against the race condition that can otherwise occur
// between the time when <select> indicates that a passive-mode
// socket handle is "ready" and when we call <accept>.During this
// interval, the client can shutdown the connection, in which case,
// the <accept> call can hang!
this->peer_acceptor_.enable (ACE_NONBLOCK); 同意楼上,调试发现确实是非阻塞的
可通过 ACE_OS::setsockopt() 更改socket属性 不对,Acceptor默认的是阻塞的!
socket,this->peer_acceptor_.enable (ACE_NONBLOCK)是在Aceeptor初始化的时候设定的,但是当Accptor监听到客户请求时会调用activate_svc_handler()函数:
它会根据flag_的值来设定从客户端连接进来的socket是阻塞的还是非阻塞的
// See if we should enable non-blocking I/O on the <svc_handler>'s
// peer.
if (ACE_BIT_ENABLED (this->flags_,
ACE_NONBLOCK))
{
if (svc_handler->peer ().enable (ACE_NONBLOCK) == -1)
result = -1;
}
// Otherwise, make sure it's disabled by default.
else if (svc_handler->peer ().disable (ACE_NONBLOCK) == -1)
flags_就是Acceptor构造函数的第三个参数,默认是0:
ACE_Acceptor (const ACE_PEER_ACCEPTOR_ADDR &local_addr, ACE_Reactor *=ACE_Reactor::instance(), int flags=0, int use_select=1, int reuse_addr=1)
0表示阻塞方式
1表示非阻塞方式
可以通过Acceptor的构造函数来设定socket的阻塞方式。
不知道说的对不对,大家一起讨论一下!
页:
[1]