免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1385 | 回复: 5
打印 上一主题 下一主题

select是怎么处理多个联接的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-10-19 09:11 |只看该作者 |倒序浏览
当一个连接成功时,有的新的连接来临,根本不可能返回到select的语句上了

  1. int x;
  2. while(1)
  3. {
  4. x = select()
  5. if(x){
  6.          accept;
  7.          recv;
  8.         }
  9. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2004-10-19 09:25 |只看该作者

select是怎么处理多个联接的?

select()两次
先select监听的socket
完了以后再select那些连接好的socket, 逐个recv或send

while(1)
{
      i_ret = select(x)
      if( i_ret >; 0 )
      {
           accept()
          ....
      }
       else
      {
            break;
       }
}
.....

while(1)
{

        i_ret = select(y);
        if( i_ret >; 0 )
        {
               ....               //将已经可读的socket上的数据读出来
               recv();
               ....
          }
          else
           {
                    break;
            }
}
....

论坛徽章:
0
3 [报告]
发表于 2004-10-19 09:29 |只看该作者

select是怎么处理多个联接的?

你这样也做不了多个同时并行啊,全都在while循环里面了

论坛徽章:
0
4 [报告]
发表于 2004-10-19 09:39 |只看该作者

select是怎么处理多个联接的?

这两个while()里没新连接,没新数据的时候是会退出来的,
select()测试的是一个描述符的集合,
select()完了以后将里面所有有数据的socket都读一把,虽然不是真正意义上
的并发,但是也是可以处理多个连接的,在外部是看不出来的。
当然如果你要真正的并发,用fork()好了,来一个fork()一个,然后子进程专门
处理这个新连接,实际上所有的socket还是一个一个读的,只不过到了系统层,
在你看来是并发了而已。
看你的具体需要了,如果应用的实时要求高,就fork(),否则fork()系统开销
大,还是用一个进程处理好了。

论坛徽章:
0
5 [报告]
发表于 2004-10-19 09:40 |只看该作者

select是怎么处理多个联接的?

如果要并行的话或者使用多进程(fork/vfork)或者直接将程序交给inetd之类的超级服务器调用

论坛徽章:
0
6 [报告]
发表于 2004-10-19 10:03 |只看该作者

select是怎么处理多个联接的?

多谢各位指点
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP