主题:请问 select客户端服务器 通信的改进
#include "inet.h"
#define BUFSIZE 1024
int server(int fd){
char b[BUFSIZE];
int n;
if((n = read(fd, b, BUFSIZE)) < 0)
return 0;
b[n] = '\0';
printf("fd = %d, n = %d, b = \"%s\"\n", fd, n, b);
return n;
}
void error(char *s)
int main(int argc, char **argv){
int sockfd, newfd;
struct sockaddr_in sin, cli;
int chilen;
fd_set allfds, fds;
int fd;
if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
error("cannot create socket");
bzero((char*)&sin, sizeof(sin));
sin.sin_family = PF_INET;
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_port = htons(SERVER_PORT);
if(bind(socked, (struct sock add *)&sin, sizeof(sin)) <0)
error("cannot bind");
if(listen(socked, 5) <0)
error("cannot listen");
FD_ZERO(&allfds);
FD_SET(sockfd, &allfds);
while(1) {
fds = allfds;
if (select(FD_SETSIZE, &fds, NULL , NULL ,NULL) < 0)
error("cannot select");
for(fd = 0; fd < FD_SETSIZE; fd++)
if(FD_ISSET(fd, $fds)) {
if(fd == sockfd) {
clilen = sizeof(cli);
if ( (newfd = accept(socked, (struct sockaddr *)&cli, &chilen)) < 0)
error("cannot accept");
printf("Accepted new connection fd = %d\n", fd);
FD_SET(newfd, &allfds);
} else if (server(fd) = 0) {
printf("Closed connection : fd = %d\n", fd);
if(shutdown(fd, SHUT_RDWR) <0)
error("cannot shutdown");
FD_CLR(fd,&allfds);
close(fd);
}
}
}
return 0;
}
这个例子里对 服务器 对于所有可能的入力出力文件描述符 》》》 fdset表现的所有bit一个一个的检查(是否是这样理解呢?)
比如这种情况下 有 6 5 4 3 2 1 0 个文件描述符号 服务器端就得 每次0 1 2 3 4 5 6 ,0 1 2 3 4 5 6的进行查询
能不能取一个minfd和maxfd 比如只有 3 4在通信 那么取maxfd=5 minfd = 2 这样服务端就可以2 3 4 5, 2 3 4 5的进行查询入力出力了 ?
希望高手能帮忙解决下了,什么好感谢的了啊 所有的分都奉上了