linux并发服务器实例,linux-----网络编程----epoll实现并发服务器
/*************************************************************************
> File Name: epoll_serve.c
> Author: xuhcen_allen
> Mail: xuchen_allen@163.com
> Created Time: 2019年02月14日 星期四 09時08分16秒
************************************************************************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define PORT 8080
int main()
{
struct sockaddr_in serv_addr,cli_addr;
socklen_t serv_len = sizeof(serv_addr);
socklen_t cli_len = sizeof(cli_addr);
//創建監聽套接字:
int lfd = socket(AF_INET,SOCK_STREAM,0);
memset(&serv_addr,0,serv_len);
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port=htons(PORT);
//綁定IP和端口:
bind(lfd,(struct sockaddr*)&serv_addr,serv_len);
//設置同時監聽最大個數:
listen(lfd,36);
printf("Waiting for connecting...\n");
//創建epoll根結點:
int epfd = epoll_create(1000);//epoll_creat中的參數現在意義不大;
//初始化epoll樹:
struct epoll_event ev;//創建一個事件:
ev.events = EPOLLIN;
ev.data.fd = lfd;
epoll_ctl(epfd,EPOLL_CTL_ADD,lfd,&ev);//將事件掛在樹上,相當于初始化epoll樹;
struct epoll_event all[2000];//用數組儲存這些事件,方便掛樹,查詢;
while(1){
//使用epoll通知內核fd 文件IO檢測;
int ret = epoll_wait(epfd,all,sizeof(all)/sizeof(all[0]),-1);//將檢測到的epfd放到事件數組all中;
//返回值是數組中準備就緒的事件數;
//遍歷all數組中的前ret個元素:
for(int i = 0;i
int fd = all[i].data.fd;
//提取出數組元素的fd,判斷是否有連接:
if(fd == lfd){//這個if判斷是判斷用于監聽的lfd是否加入到了ret中,如果加入了,就說明有新的連接;
int cfd = accept(lfd,(struct sockaddr*)&cli_addr,&cli_len);
if(cfd<0){
perror("accept error");
exit(1);
}
//將新得到的cfd掛到樹上:
struct epoll_event temp;
temp.events = EPOLLIN;
temp.data.fd = cfd;
epoll_ctl(epfd,EPOLL_CTL_ADD,cfd,&temp);
//打印客戶端信息:
char ip[64];
printf("New Client IP:%s ,\t Port:%d\n",inet_ntop(AF_INET,&cli_addr.sin_addr.s_addr,ip,sizeof(ip)) ,ntohs(cli_addr.sin_port));
}
else{
//處理已經連接的客戶端發送過來的數據:
if(!all[i].events & EPOLLIN){
continue ;
}
//讀數據:
char buf[1024];
int len = recv(fd,buf,sizeof(buf),0);
if(len<0){
perror("recv fail");
exit(1);
}
else if(len==0){
printf(" client disconnecting...\n ");
close(fd);
//fd從epoll樹中取下來:
epoll_ctl(epfd,EPOLL_CTL_DEL,fd,NULL);
}
else{
printf( "recv success:\n");
write(STDOUT_FILENO,buf,len);
}
}
}
}
close(lfd);
return 0;
}
總結
以上是生活随笔為你收集整理的linux并发服务器实例,linux-----网络编程----epoll实现并发服务器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux搜索含多个字符串,使用grep
- 下一篇: linux 内核将两个设备相关联,lin