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

我用select()想设置定时,可是一点作用都没有

    来源: 互联网  发布时间:2016-07-11

    本文导语:  想用select的timeout功能直接设置超时,当客户端4秒内不输入则自动提示超时,并返回。。 可是一点反应都没有阿。。过了4秒还是在等待客户端输入。。汗 求高手帮忙~ 代码如下: #include "common.h" #define MAX(a,b) (...

想用select的timeout功能直接设置超时,当客户端4秒内不输入则自动提示超时,并返回。。

可是一点反应都没有阿。。过了4秒还是在等待客户端输入。。汗

求高手帮忙~

代码如下:



#include "common.h"
#define MAX(a,b) (a)>(b)?(a):(b)

void process(FILE *fp,int sockfd);
void* sleeping(void* );
char* getMessage(char* sendline,int len,FILE *fp);

int main(int argc,char *argv[])
{
int sockfd;
struct hostent *he;
struct sockaddr_in ser_addr;



if (argc !=2) {printf("enter server's ip.n");exit(1);}

if ((he=gethostbyname(argv[1]))==NULL)
{
printf("gethostname error.n");
exit(1);
}

sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd==-1)
{
perror("socket error.n");
exit(1);
}

bzero(&ser_addr,sizeof(ser_addr));
ser_addr.sin_family=AF_INET;
ser_addr.sin_port=htons(SERVER_PORT);
ser_addr.sin_addr=*((struct in_addr *)he->h_addr);



if(connect(sockfd,(struct sockaddr *)&ser_addr,sizeof(ser_addr))==-1)
{
perror("connect error.n");
exit(1);
}

process(stdin,sockfd);
//pthread_t tid1;
//pthread_create(&tid1,NULL,process,(void *)sockfd);
//process(stdin,sockfd);
close(sockfd);

}





void process(FILE *fp, int sockfd)
{
//int state=(int)"PTHREAD_CANCEL_ASYCHRONOUS";
//int *ostate=(int*)"PTHREAD_CANCEL_DEFFERED";
//pthread_setcanceltype(state,(int*)ostate);
char sendline[MAXDATASIZE],recvline[MAXDATASIZE];
//int num;
printf("connect to server.n");

fd_set ufds;
struct timeval tv;
int fd1,fd2,maxfd,status;
FD_ZERO(&ufds);
for(;;)
{

FD_SET(fileno(fp),&ufds);///error.
FD_SET(sockfd,&ufds);
//maxfd=((fd1>fd2)?(fd1):(fd2)) + 1 ;
maxfd=MAX(fileno(fp), sockfd) + 1;


tv.tv_sec=3;
tv.tv_usec=0;
status = select (maxfd, NULL, &ufds, NULL ,&tv);



if (status==0)
{
close(sockfd);
fprintf(stderr, "timeoutn");
printf("%dn", time(NULL));
return ;
}
else if (status==-1)
{
printf("error.n");
exit(1);
}
else {
if(FD_ISSET(fileno(fp), &ufds))

{

    scanf("%s",sendline);

    send(sockfd,sendline,strlen(sendline),0);

    bzero(sendline, 1024);

}
else if(FD_ISSET(sockfd, &ufds))

{

    memset(recvline,0,1024);

    recv(sockfd,recvline,1024,0);

    printf("remote:    %sn",recvline);

}

 }

}






}



|
就是select参数位置放错了,其他的没有问题。
status = select(maxfd, NULL, &ufds, NULL ,&tv);
应该为
status = select(maxfd, &ufds, NULL, NULL ,&tv);

把sockfd放到ufds没有问题,代码是可读时接收数据并打印。
recv(sockfd,recvline,1024,0);
printf("remote: %sn",recvline); 

|
status = select (maxfd, NULL, &ufds, NULL ,&tv); 
//=========================

参数有问题吧?应该是select (maxfd, &ufds,NULL, NULL ,&tv);

第二个才是可读文件描述符集

    
 
 

您可能感兴趣的文章:

  • select函数的作用是什么呢?谢谢
  • jQuery:delegate中select()不起作用的解决方法(实例讲解)
  • select函数不起作用
  • HTML中的<select>标签如何设置默认选中的选项
  • jquery select默认选中的设置方法
  • html中<select>标签用法解析及如何设置select的默认选中状态
  • select() 的超时设置
  • JQUERY 设置SELECT选中项代码
  • jquery select 设置默认选中的示例代码
  • 关于select的设置问题
  • jquery操作select详解(取值,设置选中)
  • Mysql select语句设置默认值的方法
  • jquery 操作select取值与设置选中值
  • jQuery 获取与设置select下拉框的值
  • Jquery 获取与设置select下拉框(示例)
  • Jquery设置选中 select、radio、checkbox 默认值的例子
  • jQuery取得设置清空select选择的文本与值
  • jquery操作select取值赋值与设置选中
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • select <0时调用exit(0),为什么程序没有退出,而是继续执行select了?
  • select * from username="xxx" and passwd="xxx"如果有记录现实YES,没有现实没有,代码如何编!!(解决就给40分)
  • select没有返回?
  • JAVA中有没有类似C中的select、poll机制的类包来实现线程并发控制
  • 请问:select函数是干什么用的啊,有没有相关的例子啊?
  • select立刻返回0,errno=0,根本没有等到超时的情况,为何
  • 非阻塞方式socket中, 去读select返回的sockfd是否一定是非0值??如果读到的字节数比期望少有没有什么好的处理模式??
  • 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定义及介绍
  • insert into select和select into的使用和区别介绍
  • java命名空间javax.swing.tree类defaulttreecellrenderer的类成员方法: selected定义及介绍
  • select+read 读服务器发送过来的数据, 假设服务器调用close后, 客户端的select是否返回这个socket可读?
  • java命名空间java.awt.event类itemevent的类成员方法: selected定义及介绍
  • JDBC里select sum和select返回的字段类型不一样
  • java命名空间javax.swing类defaultbuttonmodel的类成员方法: selected定义及介绍
  • sql代码:select database select all table
  • java命名空间javax.swing.text.html类html.tag的类成员方法: select定义及介绍
  • Oracle中select 1和select *的区别
  • java命名空间javax.swing.text.html类html.attribute的类成员方法: selected定义及介绍
  • jquery下拉select控件操作方法分享(jquery操作select)
  • java命名空间javax.swing.plaf.synth接口synthconstants的类成员方法: selected定义及介绍
  • INSERT INTO SELECT语句与SELECT INTO FROM语句的一些区别
  • java命名空间javax.sound.midi类shortmessage的类成员方法: song_select定义及介绍
  • select into 和 insert into select 两种表复制语句
  • java命名空间javax.swing类jfilechooser的类成员方法: cancel_selection定义及介绍
  • select into与insert into select 表复制语句学习实例


  • 站内导航:


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

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

    浙ICP备11055608号-3