#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <strings.h>
#include<error.h>
#include <errno.h>
#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
#include <sys/wait.h>
#include<limits.h>
#include<poll.h>
#include<features.h>
#define INFTIM -1
const int OPEN_MAX=1024;
int
main(int argc, char **argv)
{
int i, maxi, listenfd, connfd, sockfd;
int nready;
ssize_t n;
char buf[1024];
char str[100];
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(2000);
bind(listenfd, (sockaddr *) &servaddr, sizeof(servaddr));
listen(listenfd, 5);
client[0].fd = listenfd;
client[0].events = POLLRDNORM;
for (i = 1; i < OPEN_MAX; i++)
client[i].fd = -1;
maxi = 0;
while (1)
{
nready = poll(client, maxi+1, INFTIM);
if (client[0].revents & POLLRDNORM) {
clilen = sizeof(cliaddr);
connfd = accept(listenfd, (sockaddr *) &cliaddr, &clilen);
for (i = 1; i < OPEN_MAX; i++)
if (client[i].fd < 0)
{
client[i].fd = connfd;
client[i].events = POLLRDNORM;
break;
}
if (i == OPEN_MAX)
{
perror("too many clients");
exit(0);
}
if (i > maxi)
maxi = i;
if (--nready <= 0)
continue;
}
for (i = 1; i <= maxi; i++) {
if ( (sockfd = client[i].fd) < 0)
continue;
if (client[i].revents & (POLLRDNORM | POLLERR)) {
if ( ( n = read(sockfd, buf, 1024)) < 0) {
if (errno == ECONNRESET) {
close(sockfd);
client[i].fd = -1;
} else
perror("read error");
} else if (n == 0) {
close(sockfd);
client[i].fd = -1;
} else
write(sockfd, buf, n);
if (--nready <= 0)
break;
}
}
}
}
转载请注明原文地址:https://blackberry.8miu.com/read-17599.html