在尝试使用select()时,我得到了一个奇怪的结果。
fd_set tempset,set; //set of descriptors
FD_ZERO(&set); //initialize descriptor set to NULL
FD_SET(serversock,&set); //add server's socket to descriptor set 'set'
timeout.tv_sec=2;
timeout.tv_usec=0;
while(1){
tempset=set;
timeout.tv_sec=2;
timeout.tv_usec=0;
printf("%s","Waiting on select\n");
int ret=select(FD_SETSIZE,&tempset,NULL,NULL,&timeout);
if(ret==0) printf("timeout ");
else if(ret==-1){
printf("Error occured\n");
exit(0);
}
else if(ret>0){ //socket ready for reading
for(i=0;i<FD_SETSIZE;i++){
if(FD_ISSET(i,&tempset)){ //check if it's serversock
if(i==serversock){
//accept connection and read/write
printf("Client connected\n");
}//i==serversock close
}
}//for ends
}
当我删除行printf(“%s”,“等待选择\ n”);选择保持无限期等待。但是,当我重新插入该行时,一切都按预期工作(使用客户端连接测试)
我错过了什么吗?
提前致谢!
答案 0 :(得分:3)
你误导了FD_SETSIZE
,你根本就不应该直接使用它。您只需将一个套接字放入fd_set
,因此根本不需要遍历它(但如果您确实需要,请改为使用fd_set.fd_count
成员。)
试试这个:
fd_set set;
timeval timeout;
while(1){
FD_ZERO(&set);
FD_SET(serversock, &set);
timeout.tv_sec = 2;
timeout.tv_usec = 0;
printf("%s","Waiting on select\n");
int ret = select(serversock+1, &set, NULL, NULL, &timeout);
if (ret==0){
printf("timeout ");
}
else if (ret==-1){
printf("Error occured\n");
exit(0);
}
else if (ret>0){ //socket ready for reading
... = accept(serversock, ...);
printf("Client connected\n");
}
}
或者:
fd_set set;
timeval timeout;
int max_fd = 0;
while(1){
FD_ZERO(&set);
FD_SET(serversock, &set);
max_fd = serversock;
// FD_SET() other sockets and updating max_fd as needed...
timeout.tv_sec = 2;
timeout.tv_usec = 0;
printf("%s","Waiting on select\n");
int ret = select(max_fd+1, &set, NULL, NULL, &timeout);
if (ret==0){
printf("timeout ");
}
else if (ret==-1){
printf("Error occured\n");
exit(0);
}
else if (ret>0){ //socket(s) ready for reading
for (u_int i = 0; i < set.fd_count; ++i){
... = accept(set.fd_array[i], ...);
printf("Client connected\n");
}
}
}