LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1184|回复: 6

关于select多连接的问题

[复制链接]
发表于 2006-10-16 21:22:04 | 显示全部楼层 |阅读模式
初接触到select,有什么地方不明白,希望可以指点一下
当我select之后
例如首先捕获一个recv可读,程序将进入其中,但是如果recv的时间比教久,在还没有读完的时候,又捕获另一个可读,那么是否是必须当本次读进行完后再读下一次?
exp:
  c=select(……)  //参数略
  if(FD_ISSET(……)) //假定真
  {
        read……;
     //若此时 select又捕获一个可读,那么程序该怎么执行
   }
因为我有可读和可写两个条件,但是却都是针对一个套接口,所以,顺序很重要。
希望有人可以指点一下
发表于 2006-10-16 22:04:30 | 显示全部楼层
select返回可读,则表示此时接收缓冲区中有数据,那么recv读是不会阻塞的,不存在recv时间很久的问题。

如果recv返回时又有数据到来,那么下次select还会返回可读,因而需要继续recv。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-17 03:07:44 | 显示全部楼层
我在这里用一个select查询可读,然后程序挂起,直到可读,那么在挂起的时候,我就不能做任何事了
比如,我首先接收到一个连接的请求,然后再发送一个结果到请求方,并等待ACK,但是假设此时,网络出现异常,那么也就意味程序将阻塞在等待ACK这一环节上,万一其他连接此时请求,我将怎么去处理其他连接的请求呢?
前提,不用fork()。
回复 支持 反对

使用道具 举报

发表于 2006-10-17 11:40:36 | 显示全部楼层
如果仅仅是等一个ack,那么说明那个descriptor还不可以读和写,select 也就不会返回, 如果有其他的连接请求,当内核探测到某个descriptor可以写或可读的话,select就会返回了.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-18 13:40:30 | 显示全部楼层
大家可能误解我的意思了。我把流程给出来
select()   //等待请求
  recv     //接收请求
  send    //回发处理结果
  recv     //等待请求方的ACK,以表示收到结果。
我的问题就在于第二个recv,第一个recv可以用select来挂起等待,而第二个recv则会阻塞,即使此时再用一个select在第2个recv处,如果发送方出现异常,那么程序也会挂在第二个select处,这样如果新连接的请求到来,那么是不可能触发第一个select的。
因为使用UDP,所以ACK是程序必须考虑的,所以我产生如此疑问,通用一点来说,即是,如果程序的一个分支中出现多个阻塞函数(如recv,recvfrom,read等等),那么如何应用select来实现并发的多连接。
回复 支持 反对

使用道具 举报

发表于 2006-10-18 18:44:14 | 显示全部楼层
这样的话你可以用非阻塞的IO. 一旦读不到就会返回一个错误.
回复 支持 反对

使用道具 举报

发表于 2006-10-21 01:38:25 | 显示全部楼层
可以对第二个recv采用异步IO的方式,使用aio_read()。
这里有些参考
http://www-128.ibm.com/developerworks/cn/linux/l-async/index.html
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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