当前位置: 技术问答>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);
}
}
}
}
可是一点反应都没有阿。。过了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);
应该为
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 (maxfd, &ufds,NULL, NULL ,&tv);
第二个才是可读文件描述符集