多进程epoll模型
来源:互联网 发布:手机调音软件 编辑:程序博客网 时间:2024/05/17 06:58
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/epoll.h>
int main(){
int listen_fd,accept_fd,flag;
struct sockaddr_in my_addr,remote_addr;
if((listen_fd = socket(AF_INET,SOCK_STREAM,0))==-1){
perror("create socket error");
exit(1);
}
if(setsockopt(listen_fd,SOL_SOCKET,SO_REUSEADDR,(char*)&flag,sizeof(flag))==-1){
perror("setsockopt error");
}
int flags = fcntl(listen_fd,F_GETFL,0);
fcntl(listen_fd,F_SETFL,flags|O_NONBLOCK);
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(3389);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if(bind(listen_fd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr_in))==-1){
perror("bind error");
exit(1);
}
if(listen(listen_fd,1)==-1){
perror("listen error");
exit(1);
}
int pid = -1;
int addr_len = sizeof(struct sockaddr_in);
int max_process_num = 3;
int child_id;
int i;
int child_process_status;
for(i=0;i<max_process_num;i++){
if(pid !=0){
pid = fork();
}else{
child_id = i;
}
}
if(pid == 0){
int accept_handles = 0;
struct epoll_event ev,events[20];
int epfd = epoll_create(256);
int ev_s = 0;
ev.data.fd = listen_fd;
ev.events = EPOLLIN|EPOLLET;
epoll_ctl(epfd,EPOLL_CTL_ADD,listen_fd,&ev);
for(;;){
ev_s = epoll_wait(epfd,events,20,500);
int i=0;
for(i=0;i<ev_s;i++){
if(events[i].data.fd == listen_fd){
int max_process_accept = 3;
if(accept_handles < max_process_accept){
accept_handles++;
int addr_len = sizeof(struct sockaddr_in);
accept_fd = accept(listen_fd,(struct sockaddr *)&remote_addr,&addr_len);
int flags = fcntl(accept_fd,F_GETFL,0);
fcntl(accept_fd,F_SETFL,flags|O_NONBLOCK);
ev.data.fd = accept_fd;
ev.events = EPOLLIN|EPOLLET;
epoll_ctl(epfd,EPOLL_CTL_ADD,accept_fd,&ev);
printf("Child:%d,ProcessID:%d,EPOLLIN,fd:%d,accept:%d\n",child_id,getpid(),listen_fd,accept_fd);
}
}
else if(events[i].events&EPOLLIN){
char in_buf[1024];
memset(in_buf,0,1024);
int recv_num = recv(events[i].data.fd,&in_buf,1024,0);
if(recv_num==0){
close(events[i].data.fd);
accept_handles--;
printf("Child:%d,ProcessID:%d,EPOLLIN,fd:%d,closed\n",child_id,getpid(),events[i].data.fd);
}
else{
printf("Child:%d,ProcessID:%d,EPOLLIN,fd:%d,recv:%s\n",child_id,getpid(),events[i].data.fd,in_buf);
}
}
}
}
}
else{
wait(&child_process_status);
}
return 0;
}
- 多进程epoll模型
- nginx 多进程进程 epoll
- 几种并发服务器模型的实现:多线程,多进程,select,poll,epoll - rail
- 几种并发服务器模型的实现:多线程,多进程,select,poll,epoll
- 多进程共享epoll fd
- EPOLL模型
- Epoll模型
- epoll模型
- epoll模型
- epoll模型
- Epoll模型
- epoll模型
- Epoll模型
- epoll 模型
- epoll模型
- Epoll模型
- Epoll模型
- epoll模型
- 新人诫言
- C#系列教程——BOOL定义
- shell脚本报错:"[: =: unary operator expected"
- 利用javadoc制作说明文档
- Linux下常用命令
- 多进程epoll模型
- SQL 通配符
- JSP页面编码研究二(MyEclipse中各种编码格式修改)
- JSP/Servlet 及相关笔记
- Cadence Allegro/Orcad 电路板方案全系列完美破解的特别说明(包括64位系统破解方法) .
- C#系列教程——BOOL类型转换
- oracle书写注意事情和sql简单介绍
- jquery ajax error函数详解
- QName