找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5754|回复: 4

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

[复制链接]
发表于 2007-12-22 21:39:49 | 显示全部楼层 |阅读模式
在用Acceptor模式的时候,当监听到客户的连接请求时,Acceptor会在底层建立一个与客户端的socket连接。我想问问这个socket是阻塞的还是非阻塞的。可以通过 Acceptor设定底层socket的阻塞模式吗?
 楼主| 发表于 2007-12-22 21:39:55 | 显示全部楼层
不过我猜Acceptor生成的socket的属性,应该是继承自Acceptor的,也就是说Accptor如果是阻塞模式的话,生成的socket也应该是阻塞的。这个应该是和调用accept()系统调用的结果是一致的。

但是我不知道怎么设置Acceptor的模式,我只是听说可以通过ACE_Sock_Stream的enable()方法设置模式。
 楼主| 发表于 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);
 楼主| 发表于 2007-12-22 21:40:12 | 显示全部楼层
同意楼上,调试发现确实是非阻塞的

可通过 ACE_OS::setsockopt() 更改socket属性
 楼主| 发表于 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的阻塞方式。

不知道说的对不对,大家一起讨论一下!
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 15:37 , Processed in 0.014628 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表