peakzhang 发表于 2007-12-22 21:39:49

请问用Acceptor建立的socket是阻塞的还是非阻塞的?

在用Acceptor模式的时候,当监听到客户的连接请求时,Acceptor会在底层建立一个与客户端的socket连接。我想问问这个socket是阻塞的还是非阻塞的。可以通过 Acceptor设定底层socket的阻塞模式吗?

peakzhang 发表于 2007-12-22 21:39:55

不过我猜Acceptor生成的socket的属性,应该是继承自Acceptor的,也就是说Accptor如果是阻塞模式的话,生成的socket也应该是阻塞的。这个应该是和调用accept()系统调用的结果是一致的。

但是我不知道怎么设置Acceptor的模式,我只是听说可以通过ACE_Sock_Stream的enable()方法设置模式。

peakzhang 发表于 2007-12-22 21:40:02

看看源码不就知道了..默认是非阻塞的

// 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);

peakzhang 发表于 2007-12-22 21:40:12

同意楼上,调试发现确实是非阻塞的

可通过 ACE_OS::setsockopt() 更改socket属性

peakzhang 发表于 2007-12-22 21:40:20

不对,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]
查看完整版本: 请问用Acceptor建立的socket是阻塞的还是非阻塞的?