免费注册 查看新帖 |

Chinaunix

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

[函数] select函数的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-06-29 11:39 |只看该作者 |倒序浏览
在socket通信中,server端使用了select函数来判断哪个客户端已经准备好了。
select(FD_SETSIZE,&readfd_set,NULL,NULL,NULL);
可是在客户端往socket中写入数据后,服务端没有反应。
请问到底在什么状况下,select才认为fd set中的描述符已做好准备了?
谢谢

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2005-06-29 12:02 |只看该作者

select函数的问题

FD_SETSIZE 是最大的文件描述符+1 吗?

猜测.

论坛徽章:
0
3 [报告]
发表于 2005-06-29 12:13 |只看该作者

select函数的问题

用gdb调试服务端的时候,查看到与客户进行通信的那个套接字已经被加入到readfd_set中了

论坛徽章:
0
4 [报告]
发表于 2005-06-29 15:24 |只看该作者

select函数的问题

还是把程序发上来吧。
大家好给你看看啊。

论坛徽章:
0
5 [报告]
发表于 2005-06-29 16:10 |只看该作者

select函数的问题

在select处阻塞了吗?把代码整上来吧

论坛徽章:
0
6 [报告]
发表于 2005-06-29 20:57 |只看该作者

select函数的问题

This is the Echo Server :
while(1){
                int result = select(FD_SETSIZE,&fds_tmp,NULL,NULL,NULL);
                if(result < 1){
                        perror("Server:server error";
                        exit(1);
                }
                int fd;
                int nread;
                for(fd=0;fd<FD_SETSIZE;fd++){
                        if(FD_ISSET(fd,&fds_tmp)){
                                
                                if(fd == s_socket){  //server socket
                                        c_socket = accept(s_socket,(struct sockaddr*)&c_addr,&client_len);
                                        FD_SET(c_socket,&fds_tmp);
                                        fprintf(stdout,"server:add client to fd set:%d\n",c_socket);
                                }else{                                                                                       
                                   ioctl(fd,FIONREAD,&nread);
                                   if(nread == 0){
                                                
                                                fprintf(stdout,"server:no data has read\n";
                                        }else{
                                              read(fd,buff,BUFFERSIZE);
                                                fprintf(stdout,"server: have read data on client %d\n",fd);
                                              write(fd,buff,BUFFERSIZE);
                                        }
                                }
                        }
                }

论坛徽章:
0
7 [报告]
发表于 2005-06-29 21:01 |只看该作者

select函数的问题

This is the Echo Client:
while(1){
               
                int count;
                count = read(STDIN_FILENO,buff,100);
                //c_socket is the client socket
                write(c_socket,buff,count);
                /*reset the buff*/
                for(i=0;i<count;i++){
                        buff = 0;
                }
               
                read(c_socket,buff,256);

                fprintf(stdout,"client:echo from server:%s\n",buff);

                fprintf(stdout,"\n";
        }

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2005-06-29 21:21 |只看该作者

select函数的问题

你把 FD_SET()....放到while(1)循环的里面试试.

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
9 [报告]
发表于 2005-06-29 21:26 |只看该作者

select函数的问题

>;>;FD_SETSIZE

这个的值 在 FD_SET(c_socket,&fds_tmp); 之后要+1的.
否则select 不会理会有被accept的描述符的.

论坛徽章:
0
10 [报告]
发表于 2005-06-29 21:29 |只看该作者

select函数的问题

主要是要实现一个类似echo服务器的,客户端发给服务端消息,然后服务端再发送回给客户端并打印出来。
至于FD_SET(),在while循环外面有一个调用,就是把服务端的socket放入其中。
刚学习,还请大虾指点呢,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP