标题:select用于socket文件描述符的问题。。
只看楼主
cmhjjosso
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2012-8-27
结帖率:100%
已结贴  问题点数:20 回复次数:8 
select用于socket文件描述符的问题。。
#define MAXLINE 8000

int main()   
{   
    int fd, n, i, get=0, total=0;
    int fds[30];
    struct sockaddr_in servaddr;
    char buf[5000], buf2[5000];
    fd_set sets;
   
    FD_ZERO(&sets);
   
    for(i=0;i<30;i++){
        fd = socket( AF_INET, SOCK_STREAM, 0 );
        fds[i] = fd;
        FD_SET(fd, &sets);
        servaddr.sin_family = AF_INET;
        inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);
        servaddr.sin_port = htons(80);
        connect( fd, (struct sockaddr *)&servaddr, sizeof(servaddr));
        sprintf( buf, "GET / HTTP/1.0\r\nHost:127.0.0.1\r\nUser-Agent:ss\r\n\r\n");
        write(fd, buf, strlen(buf));
    }
   
    while(1){
        get = select(FD_SETSIZE, &sets, NULL, NULL, NULL);
        for(i=0;i<30;i++){
            if(FD_ISSET(fds[i], &sets)){
                FD_CLR(fds[i], &sets);
                printf("%d\n", ++total);
            }
        }
        if(total == 30)
            break;
    }

}   
这是什么情况 明明另外几个文件描述符是可以写的 select没事返回。。。

结果是
get one
1
get one
2
get one
3
get one
4
get one
5
get one
6
get one
7
get one
8
get one
9
get one
10
然后就卡住了。。。

[ 本帖最后由 cmhjjosso 于 2012-8-27 18:03 编辑 ]
搜索更多相关主题的帖子: total 文件 
2012-08-27 15:30
cmhjjosso
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2012-8-27
得分:0 
自己顶下。。。
2012-08-27 18:02
silent_world
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:258
专家分:1138
注 册:2011-9-24
得分:0 
你这段代码问题如下:
1、FD_SETSIZE,这个是从哪儿来的。select第一个参数为最大socketID号 + 1;
2、你仅仅设置read fd_set, write fd_set为空。

你先修改下试试,有问题再问。
2012-08-27 18:06
cmhjjosso
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2012-8-27
得分:0 
FD_SETSIZE在我的linux上是1024, 我设置为最大的文件描述符加1也是一样的。。。 你说的第二个为空是什么意思。。。 用(fd_set *)0吗? 那个和NULL没有区别吧。。。。
2012-08-27 18:31
cmhjjosso
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2012-8-27
得分:0 
没人理我么。。。 继续顶上去
2012-08-27 21:55
silent_world
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:258
专家分:1138
注 册:2011-9-24
得分:20 
回复 4楼 cmhjjosso
你没有好好看我的答复。
问题还继续存在:
1、select第一个参数为最大socketID号 + 1,FD_SETSIZE仅仅是set的大小,不是socketID + 1号,完全是两码事;
2、你仅仅设置read fd_set, write fd_set为空。意思是,你如果需要判断是否可写,不能为空,不能,明白不?
3、你使用临时set,会被结果覆盖。

cpu相对网络速度可算天文数字,可以在网络上测试。

以为你有一定基础,写得比较概述。看不明白继续提问,编程是科学,切忌主观理解,切记。

[ 本帖最后由 silent_world 于 2012-8-29 09:41 编辑 ]
2012-08-29 09:39
silent_world
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:258
专家分:1138
注 册:2011-9-24
得分:0 
程序卡住是因为你select时间设置为NULL,你设置一个时间即可。
2012-08-29 09:44
cmhjjosso
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2012-8-27
得分:0 
6楼:发现问题了。。。  sets需要重新赋值才可以, 我的确是希望要覆盖, 可惜一直没有覆盖。。。 应该是函数处理问题, 总之重新赋值就OK了
2012-08-29 11:37
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
得分:0 
比我强大啊,我UNIX操作系统才学到了 高级I/0这  进程间的通讯和网络套接字 还没看到呢   楼主威武

我要成为嘿嘿的黑客,替天行道
2012-08-29 12:43



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-380184-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.176743 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved