当前位置:  技术问答>linux和unix

select实现I/O异步问题

    来源: 互联网  发布时间:2017-03-25

    本文导语:  在文章里copy了一段代码如下,但是select同时监听服务器套接字返回和终端输入的时候,始终监听不到套接字可读,不知道哪位大侠能解答下。。。 void str_cli09(FILE *fp,int sockfd) {         int maxfdp1;         fd_...

在文章里copy了一段代码如下,但是select同时监听服务器套接字返回和终端输入的时候,始终监听不到套接字可读,不知道哪位大侠能解答下。。。

void str_cli09(FILE *fp,int sockfd)
{
        int maxfdp1;
        fd_set rset,eset;
        char sendline[256],recvline[256];

        FD_ZERO(&rset);
        FD_ZERO(&eset);
        while(1)
        {
                FD_SET(sockfd,&rset);//服务器套接字返回监听
                FD_SET(fileno(fp),&rset);//终端写入数据监听
                maxfdp1=max(fileno(fp),sockfd)+1;
                if(select(maxfdp1,&rset,NULL,NULL,NULL)>0)
                {
                if(FD_ISSET(sockfd,&rset)){//检查sockfd是否可读,但是这里始终检查不到数据,单独监听sockfd,不监听fileno(fp)则没有这个问题,
                  //不知道哪位大侠知道什么原因
                        if(read(sockfd,recvline,256)==0){
                                perror("str_cli09: server terminated");
                                FD_CLR(sockfd,&rset);
                                FD_ZERO(&rset);
                                exit(1);
                        }
                        fputs(recvline,stdout);
                }


                if(FD_ISSET(fileno(fp),&rset)){
                        if(fgets(sendline,256,fp)==NULL)
                                return;
                        write(sockfd,sendline,strlen(sendline));
                }

                }
                FD_CLR(sockfd,&rset);
                FD_CLR(fileno(fp),&rset);
                FD_CLR(sockfd,&eset);
                FD_ZERO(&rset);
                FD_ZERO(&eset);
                memset(sendline,0,256);
                memset(recvline,0,256);
        }
}

|
你有没有发送消息到这个socket?这恐怕是答案。
还有,你这个程序,不评价,先把API搞明白。另外select会被信号唤醒,返回-1.
发个程序的模版给你吧:

int func(int fd1, int fd2)
{
int retval;

int fdmax = ((fd1>fd2) ? fd1:fd2)+1;
int rset, rset_r;
FD_ZERO(&rset);
FD_SET(fd1, &rset);
FD_SET(fd2, &rset);

while(1){
rset_r = rset;
// 这一句强调被信号中断后重启select
do{
retval = select(fdmax, &rset, NULL, NULL, NULL);
}while(retval == -1);

if(FD_ISSET(fd1, &rset)){
// your code
}else if(FD_ISSET(fd2, &rset)){
// your code
}
}
}

|
如果有数据过来,应该可以检测到。建议直接用recv函数接收,能接收到么?或者直接截个包看一下

    
 
 

您可能感兴趣的文章:

  • select如何实现发送的阻塞和解除阻塞?
  • JSP中如何实现动态select选项框?
  • 在MySQL如何实现如:select top 2 * from board; 这样的提取前N条记的功能?
  • 关于select()和poll()在效率和实现上的区别的一些疑惑?望专家解答一下,感谢!
  • 请问,如何实现并处理JTree节点Multi-Selected?
  • JAVA中有没有类似C中的select、poll机制的类包来实现线程并发控制
  • jquery实现Select option项的添加、删除、取值
  • 两级联动select刷新后其值保持不变的实现方法
  • php下巧用select语句实现mysql分页查询
  • jquery 操作两个select实现值之间的互相传递
  • Mysql select in 按id排序实现方法
  • 单个select语句实现MySQL查询统计次数
  • nanosleep小延时不能实现,这个函数和select、sleep用什么区别
  • jquery 省市select下拉框替换如何实现
  • ejb中的实体bean要不要实现查找方法 “select * from name where name='name'"
  • jquery实现省市select下拉框的替换(示例代码)
  • JQuery禁用radio、select、checkbox的实现代码
  • linux使用select实现精确定时器详解
  • 基于JQuery实现的Select级联
  • 求助!ntp协议客户端实现时,select超时
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 伪终端和select的问题
  • 初学者 select的联动问题
  • linux串口读取数据的问题,select
  • select问题
  • select调用的&wset问题
  • 有关select的返回时间问题
  • select函数的问题
  • 有关select的问题
  • 困惑,select语句的问题
  • 关于<sys/select.h>的问题
  • 网络select问题
  • 问个select的问题
  • Linux 中 select 函数问题 !!!!!!!!!!!!!!
  • select 问题
  • 请教select的使用问题
  • socket通讯使用select的问题
  • 新手请教一个select accept 问题 ?
  • select函数问题?
  • TCP通信select 非常奇怪的问题
  • 关于select定时器的问题
  • java命名空间javax.accessibility类accessiblestate的类成员方法: selected定义及介绍
  • 究竟怎么样取得的<select name="select_user" size="8" multiple>值
  • java命名空间javax.accessibility类accessiblestate的类成员方法: selectable定义及介绍
  • man select 结果返回 No manual entry for select
  • java命名空间javax.swing.tree类defaulttreeselectionmodel的类成员方法: selection定义及介绍
  • select <0时调用exit(0),为什么程序没有退出,而是继续执行select了?
  • java命名空间javax.swing.tree类defaulttreecellrenderer的类成员方法: selected定义及介绍
  • insert into select和select into的使用和区别介绍
  • java命名空间java.awt.event类itemevent的类成员方法: selected定义及介绍
  • select+read 读服务器发送过来的数据, 假设服务器调用close后, 客户端的select是否返回这个socket可读?
  • java命名空间javax.swing类defaultbuttonmodel的类成员方法: selected定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3