您的位置:首页 > 其它

C-socket编-epoll()模型

2017-04-10 10:42 134 查看
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <errno.h>
#include <ctype.h>

#include "wrap.h"

#define SERV_PORT 8888
#define MAX_LINE  1024

int main()
{
int epfd,listenfd,connfd,sockfd;
int i,j,n,nready;
char buf[MAX_LINE], str[INET_ADDRSTRLEN];
struct sockaddr_in clieaddr, servaddr;
socklen_t clielen;
epfd=epoll_create(MAX_LINE); /*创建epoll根节点*/
listenfd=Socket(AF_INET, SOCK_STREAM, 0);

int opt=1;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

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, (struct sockaddr *)&servaddr, sizeof(servaddr));
Listen(listenfd,MAX_LINE);

struct epoll_event evt,en[MAX_LINE];
evt.events=EPOLLIN;
evt.data.fd=listenfd;

epoll_ctl(epfd, EPOLL_CTL_ADD, listenfd,&evt);
while(1)
{
nready=epoll_wait(epfd,en,MAX_LINE,-1);

for(i=0;i<nready;i++)
{
if(!(en[i].events & EPOLLIN))
continue;
if(en[i].data.fd == listenfd)
{
clielen=sizeof(clieaddr connfd=Accept(listenfd,(struct sockaddr *)&clieaddr, &clielen
);
evt.data.fd=connfd;
epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,&evt);
printf("received from %s at port %d \n",
inet_ntop(AF_INET, &clieaddr.sin_addr,str,sizeof(str)),
ntohs(clieaddr.sin_port));
}
else
{
sockfd=en[i].data.fd;
n=read(sockfd,buf,MAX_LINE);
if(n==0)
{/*剔除并关闭文件描述符*/
epoll_ctl(epfd,EPOLL_CTL_DEL,sockfd,NULL);
close(sockfd);
printf("client[%d] closed connection\n",sockfd);
}
else if(n<0)
{
perror("read n < 0 error");
epoll_ctl(epfd,EPOLL_CTL_DEL,sockfd,NULL);
close(sockfd);
}
else
{
printf("n=%d\n",n);
for(j=0; j<n ; j++)
buf[j]=toupper(buf[j]);
sleep(1);
printf("buf=%s",buf);
write(sockfd,buf,n);
}
}
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: