免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: iw1210
打印 上一主题 下一主题

[C] 既然每次调用select都要重新构建套接字集合,有FD_ZERO就足够用了,为啥还有FD_CLR ? [复制链接]

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
11 [报告]
发表于 2013-02-28 14:22 |只看该作者
代码里没做仔细, 应该在accept后判断fd是否<FD_SETSIZE, 不成立则close干掉连接, 另外应该select FD_SETSIZE而不是+1.

论坛徽章:
0
12 [报告]
发表于 2013-02-28 14:33 |只看该作者
百度了select函数,对第一个参数的解释不一样,说是select监视的文件句柄数,汗,哪个说法正确 。。。谁帮忙man一下select看看

int select(nfds, readfds, writefds, exceptfds, timeout)
int nfds;
fd_set *readfds, *writefds, *exceptfds;
struct timeval *timeout;
ndfs:select监视的文件句柄数,视进程中打开的文件数而定,一般设为你要监视各文件
中的最大文件号加一。

论坛徽章:
0
13 [报告]
发表于 2013-02-28 14:38 |只看该作者
linux_c_py_php 发表于 2013-02-28 14:22
代码里没做仔细, 应该在accept后判断fd是否<FD_SETSIZE, 不成立则close干掉连接, 另外应该select FD_SETSIZE而不是+1.

如果fd<FD_SETSIZE, 就close连接,这。。。。这个客户就进不来了?

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
14 [报告]
发表于 2013-02-28 14:39 |只看该作者
必须进不来, select的fdset是一个位图, 只有1024个比特, 表示范围[0, 1024)的fd, 并不是说select可以监视1024个fd, 而是select只能监视值为[0, 1024)的fd, 有了这个概念你就知道是不是必须close掉了.

论坛徽章:
0
15 [报告]
发表于 2013-02-28 14:44 |只看该作者
linux_c_py_php 发表于 2013-02-28 14:39
必须进不来, select的fdset是一个位图, 只有1024个比特, 表示范围[0, 1024)的fd, 并不是说select可以监视1024个fd, 而是select只能监视值为[0, 1024)的fd, 有了这个概念你就知道是不是必须close掉了. ...


,不会吧,这样程序还怎么写,用户又不能自己控制accept返回的fd数值范围~!~~

论坛徽章:
0
16 [报告]
发表于 2013-02-28 14:55 |只看该作者
linux_c_py_php 发表于 2013-02-28 14:39
必须进不来, select的fdset是一个位图, 只有1024个比特, 表示范围[0, 1024)的fd, 并不是说select可以监视10 ...


linux man 2 是这样:

int select(int nfds, fd_set *readfds, fd_set *writefds,
                  fd_set *exceptfds, struct timeval *timeout);

nfds is the highest-numbered file descriptor in any of the three sets, plus 1.
nfds 是3个标志位中的最大值加1

论坛徽章:
0
17 [报告]
发表于 2013-02-28 15:00 |只看该作者
额,又看到这句话了

An fd_set is a fixed size buffer.  Executing FD_CLR() or FD_SET() with a value
       of fd that is negative or is equal to or larger than FD_SETSIZE will result in
       undefined behavior.  Moreover, POSIX requires fd to be a valid file
       descriptor.

论坛徽章:
0
18 [报告]
发表于 2013-02-28 15:02 |只看该作者
本帖最后由 iw1210 于 2013-02-28 15:02 编辑

难道 accept 的返回值,只要是有效的fd,就一定在[0,FD_SETSIZE] 范围?

论坛徽章:
0
19 [报告]
发表于 2013-02-28 15:16 |只看该作者

论坛徽章:
0
20 [报告]
发表于 2013-02-28 15:21 |只看该作者
有没有解决办法?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP