- 论坛徽章:
- 0
|
这是一个比较典型的select的例子代码,
现在我的问题就是怎么知道在rset里哪些
socket可以读写呢。
FD_ISSET(sockfd, &rset))
这个语句只能说明sockfd在rset里,并不能说明
sockfd可以读写啊??
- for ( ; ; ) {
- rset = allset; /* structure assignment */
- nready = Select(maxfd+1, &rset, NULL, NULL, NULL);
- if (FD_ISSET(listenfd, &rset)) { /* new client connection */
- clilen = sizeof(cliaddr);
- connfd = Accept(listenfd, (SA *) &cliaddr, &clilen);
- for (i = 0; i < FD_SETSIZE; i++)
- if (client[i] < 0) {
- client[i] = connfd; /* save descriptor */
- break
- }
- if (i == FD_SETSIZE) err_quit("too many clients");
- FD_SET(connfd, &allset); /* add new descriptor to set */
- if (connfd >; maxfd) maxfd = connfd; /* for select */
- if (i >; maxi) maxi = i; /* max index in client[] array */
- if (--nready <= 0) continue; /* no more readable descriptors */
- }
- for (i = 0; i <= maxi; i++) { /* check all clients for data */
- if ( (sockfd = client[i]) < 0) continue;
- if (FD_ISSET(sockfd, &rset)) {
- if ( (n = Readline(sockfd, line, MAXLINE)) == 0) {
- /*4connection closed by client */
- Close(sockfd);
- FD_CLR(sockfd, &allset);
- client[i] = -1;
- }
- else Writen(sockfd, line, n);
- if (--nready <= 0) break; /* no more readable descriptors */
- }
- }
- } //end of for loop
复制代码 |
|