免费注册 查看新帖 |

Chinaunix

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

[SCO UNIX] 帮忙看一下为什么用select不阻塞? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-12-01 17:35 |只看该作者 |倒序浏览
我用了下面的写法实现阻塞等待,但不是这样,是什么原因造成的呢?
select(maxfd+1, &allset, NULL, NULL, NULL);

论坛徽章:
0
2 [报告]
发表于 2003-12-01 21:30 |只看该作者

帮忙看一下为什么用select不阻塞?

跟&allset的内容有关

论坛徽章:
0
3 [报告]
发表于 2003-12-01 21:31 |只看该作者

帮忙看一下为什么用select不阻塞?

struct timeval selectTimeOut;
select(maxfd, NULL, NULL, NULL, &selectTimeOut); // 将select作定时器用

论坛徽章:
0
4 [报告]
发表于 2003-12-02 08:45 |只看该作者

帮忙看一下为什么用select不阻塞?

[quote]原帖由 "mindit"]跟&allset的内容有关[/quote 发表:

你认为&allset的内容有什么疑问呢?
我已用
FD_ZERO(&allset);
FD_SET(listenfd,&allset);
这两个宏初始化了,这会和listenfd的属性有关吗?(阻塞和非阻塞)

论坛徽章:
0
5 [报告]
发表于 2003-12-02 09:00 |只看该作者

帮忙看一下为什么用select不阻塞?

是不是死循环了,可能何select的返回值有关,或者是你的select没有设置时间

论坛徽章:
0
6 [报告]
发表于 2003-12-02 09:04 |只看该作者

帮忙看一下为什么用select不阻塞?

我是用了循环,但对select没有设置时间:最后一个参数为NULL,我的用法如下:
select(maxfd+1, &allset, NULL, NULL, NULL);
select在有连接上来时也是为0;

论坛徽章:
0
7 [报告]
发表于 2003-12-02 09:10 |只看该作者

帮忙看一下为什么用select不阻塞?

如果maxfd有没有设置,如果小于等于0了该continue了

论坛徽章:
0
8 [报告]
发表于 2003-12-02 09:17 |只看该作者

帮忙看一下为什么用select不阻塞?

我每次都打印了:值都为6,(就是listenfd的值,我在同一台机子上重启该进程,listenfd的值都不变)下面是我实现的一段代码:
int CreateSocket(int isblock)
{
        int cnt;
        int flag;
        int sockfd;
        int opt=1;
        int len=sizeof(opt);
       
        //struct linger lin={1,0};
       
        if ((sockfd=socket(PF_INET,SOCK_STREAM,0))<0)
        {
                printf("socket call error!\n";
                close(sockfd);
                exit (-1);
        }
        printf("------------>;>;开始建立SOCK = (%d)\n", sockfd);
        setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,len);       
       
        //设置为阻塞或非阻塞方式
       
        flag=fcntl(sockfd,F_GETFL);
        if (isblock!=1)
                fcntl(sockfd,F_SETFL,flag|O_NDELAY);
        else
                fcntl(sockfd,F_SETFL,~O_NDELAY&flag);
        return sockfd;
}
//实现RST分组来关闭连接

int ServLisen(int tcp_port)
{
        int sockln;
        int iRnt = -1;
        struct sockaddr_in svr_tcp;
       
        sockln=CreateSocket(1);
       
        bzero((char *)&svr_tcp,sizeof(svr_tcp));
        svr_tcp.sin_family=AF_INET;
        svr_tcp.sin_port=htons(tcp_port);
        //svr_tcp.sin_addr.s_addr=htonl(INADDR_ANY);
        svr_tcp.sin_addr.s_addr=inet_addr("202.100.99.60";
       
        if ((iRnt = bind(sockln,(struct sockaddr*)&svr_tcp,sizeof(struct sockaddr)))<0)
        {
                printf("\nTCP port is busy!\n";
      return(-1);       
        }
        else
                printf("------------->;>;绑定 iRnt = (%d)成功\n", iRnt);
        if ((iRnt = listen(sockln,LISTENNUM))<0)
        {
                printf("\nListen error!\n";
            return(-1);       
        }
        else
                printf("------------->;>;监听 iRnt = (%d)成功\n", iRnt);
        return sockln;               
}

论坛徽章:
0
9 [报告]
发表于 2003-12-02 10:20 |只看该作者

帮忙看一下为什么用select不阻塞?

我刚才试了一下:
把maxfd = 0后就能阻塞了,是不是ServLisen(int tcp_port)调用有问题,好像每次启动进程其返回值listenfd的值都为6?帮忙看一下它的写法有什么问题。

论坛徽章:
0
10 [报告]
发表于 2003-12-02 10:56 |只看该作者

帮忙看一下为什么用select不阻塞?

不像,这个没问题,感觉有点奇怪我觉得最好从creatsockt是listenfd获得他的返回值比较好,是不是listenfd没有初始化,是不是在maxfd==0是来个返回select返回值=0是作些处理
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP