0% found this document useful (0 votes)
13 views4 pages

Poll Function

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
13 views4 pages

Poll Function

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 4

#include <poll.

h>

int poll (struct pollfd *fdarray,


unsigned long nfds, int timeout);

/* Returns: count of ready descriptors, 0 on timeout, –1 on error */

struct pollfd {
int fd; /* descriptor to check */
short events; /* events of interest on fd */
short revents; /* events that occurred on fd */
};

#include "unp.h"
#include <limits.h> /* for OPEN_MAX */

int
main(int argc, char **argv)
{
int i, maxi, listenfd, connfd, sockfd;
int nready;
ssize_t n;
char buf[MAXLINE];
socklen_t clilen;
struct pollfd client[OPEN_MAX];
struct sockaddr_in cliaddr, servaddr;

listenfd = Socket(AF_INET, SOCK_STREAM, 0);

bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);

Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));

Listen(listenfd, LISTENQ);

client[0].fd = listenfd;
client[0].events = POLLRDNORM;
for (i = 1; i < OPEN_MAX; i++)
client[i].fd = -1; /* -1 indicates available entry */
maxi = 0; /* max index into client[] array */
/* end fig01 */

/* include fig02 */
for ( ; ; ) {
nready = Poll(client, maxi+1, INFTIM);

if (client[0].revents & POLLRDNORM) { /* new client


connection */
clilen = sizeof(cliaddr);
connfd = Accept(listenfd, (SA *) &cliaddr, &clilen);
printf("new client: %s\n", Sock_ntop((SA *) &cliaddr,
clilen));

for (i = 1; i < OPEN_MAX; i++)


if (client[i].fd < 0) {

client[i].fd = connfd; /* save descriptor */


break;
}
if (i == OPEN_MAX)
err_quit("too many clients");

client[i].events = POLLRDNORM;
if (i > maxi)
maxi = i; /* max index in client[] array
*/

if (--nready <= 0)
continue; /* no more readable descriptors
*/
}

for (i = 1; i <= maxi; i++) { /* check all clients for data


*/
if ( (sockfd = client[i].fd) < 0)
continue;
if (client[i].revents & (POLLRDNORM | POLLERR)) {
if ( (n = read(sockfd, buf, MAXLINE)) < 0) {
if (errno == ECONNRESET) {
/* connection reset by client */
printf("client[%d] aborted connection\n", i);
Close(sockfd);
client[i].fd = -1;
} else
err_sys("read error");
} else if (n == 0) {
/* connection closed by client */
printf("client[%d] closed connection\n", i);
Close(sockfd);

client[i].fd = -1;
} else
Writen(sockfd, buf, n);

if (--nready <= 0)
break; /* no more readable descriptors
*/
}
}
}
}

You might also like