当前位置: 技术问答>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.
发个程序的模版给你吧:
还有,你这个程序,不评价,先把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函数接收,能接收到么?或者直接截个包看一下