您的位置:首页 > 编程语言

poll服务端代码实现

2015-08-11 16:34 267 查看
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <poll.h>
#include <sys/sendfile.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <fcntl.h>
#include <errno.h>

#define MAXLINE 1024
#define OPEN_MAX 10

int main()
{
int listenfd, connfd, sockfd, i, maxi;
int nready;
ssize_t n;
char line[MAXLINE];
//FILE *fp = fopen("epoll.unl", "w");

struct pollfd client[OPEN_MAX];
struct sockaddr_in cliaddr, servaddr;
socklen_t clilen;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
int enable = 1;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR,  &enable, sizeof(int));
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(12345);
bind(listenfd, (struct 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;

for(; ;)
{
sleep(2);
nready = poll(client, maxi + 1, 0);// -1:阻塞,永远等待  0:立即返回,不阻塞  >0:等待指定的毫秒数
printf("nready = %d\n", nready);
if(client[0].revents & POLLRDNORM)
{
printf("start accept...\n");
clilen = sizeof(cliaddr);
connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen);
for(i = 1; i < OPEN_MAX; i++)
{
if(client[i].fd < 0)
{
client[i].fd = connfd;
break;
}
}
if(i == OPEN_MAX)
{
printf("too many clients\n");
exit(1);
}
client[i].events = POLLRDNORM;
if(i > maxi)
{
maxi = i;
printf("listen maxi = %d\n", maxi);
}
if(--nready <= 0)
{
continue;
}
printf("listen nready = %d\n", nready);
}
printf("maxi = %d\n", maxi);
for(i = 1; i <= maxi; i++)
{
if((sockfd = client[i].fd) < 0)
{
continue;
}
if(client[i].revents & (POLLRDNORM | POLLERR))
{
if((n = read(sockfd, line, MAXLINE)) < 0)
{
if(errno == ECONNRESET)
{
close(sockfd);
client[i].fd = -1;
}
else
{
printf("readline error\n");
}
}
else if(n == 0)
{
close(sockfd);
client[i].fd == -1;
}
else
{
printf("readline:%s\n", line);
write(sockfd, line, n);
}
if(--nready <= 0)
{
break;
}
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: