请问 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的进行查询入力出力了 ?
希望高手能帮忙解决下了,什么好感谢的了啊 所有的分都奉上了