epoll 网络模型 学习代码

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <strings.h>
#include <sys/wait.h>
#include <errno.h>
#include <string.h>
#include <time.h>
#include <sys/select.h>
#include <sys/epoll.h>

#define MAX_BUFFER_SIZE 128
#define MAX_EPOLL 100

//socket 创建 绑定监听
int mz_ipv4_tcp_create_socket()
{
   int listenfd, sockfd, opt = 1;
	struct sockaddr_in server, client;
	socklen_t len;
	int timep;
	int ret;
 
	listenfd = socket(AF_INET, SOCK_STREAM, 0);
	if(listenfd < 0){
		perror("Create socket fail.");
		return -1;
	} 
 
	if((ret = setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) < 0){
		perror("Error, set socket reuse addr failed");  
		return -1;
	}
 
	bzero(&server, sizeof(server));
	server.sin_family = AF_INET;
	server.sin_port   = htons(8888);
	server.sin_addr.s_addr  = htonl(INADDR_ANY);
	
	len = sizeof(struct sockaddr);
	if(bind(listenfd, (struct sockaddr *)&server, len)<0){
			  perror("bind error.");
		return -1;
	}
	
	  
	listen(listenfd, 10);
 
	return listenfd;

}


int main(int argc,char *argv[])
{
    int clientfd,sockfd,maxfd,fd[1024];
   struct sockaddr_in clienaddr;
   socklen_t len;
   struct epoll_event ev ,event[MAX_EPOLL];

    int epfd;
   int ret,num;
 int i=0;
 char readbuf[100];

    memset(readbuf,0,sizeof(readbuf));

   sockfd=mz_ipv4_tcp_create_socket();

//调用epoll_create建立一个epoll对象(在epoll文件系统中给这个句柄分配资源);
  epfd=epoll_create(MAX_EPOLL);
  if(epfd<0)
  {
      perror("epoll_create error");
      exit(1);
  }
 
  ev.events = EPOLLIN; //监听sockfd 是否可读写
ev.data.fd=sockfd;
/*调用epoll_ctl向epoll对象中添加这100万个连接的套接字;*/
//该函数用于控制某个文件描述符上的事件,可以注册事件,修改事件,删除事件
ret=epoll_ctl(epfd, EPOLL_CTL_ADD,sockfd,&ev);
if(ret==-1)
{
    perror("epoll ctl error 1111");
    exit(1);
}
len =sizeof(clienaddr);
while(1)
{
//epoll_wait范围之后应该是一个循环,遍利所有的事件
    if((num=epoll_wait(epfd,event,MAX_EPOLL,-1))==-1)//-1 zuse 
    {
        perror("wait error");
        exit(1);
    }
    for(i=0;i<num;i++)
    {
        if(event[i].data.fd==sockfd)
        {
           clientfd = accept(sockfd, (struct sockaddr *)&clienaddr, &len);
           if(clientfd==-1)
           {
               perror("ccept error");
               exit(1);
           }
           //zhu che shi jian 
           ev.data.fd=clientfd;
           ev.events =EPOLLIN;
           ret=epoll_ctl(epfd, EPOLL_CTL_ADD,clientfd,&ev);
           if(ret==-1)
           {
               perror("epoll ctl error22222");
               exit(1);
           }
        }

          else if(event[i].events&EPOLLIN)//是否可读
        {
            ret=recv(event[i].data.fd,readbuf,sizeof(readbuf),0);
            if(ret==-1)
            {
                perror("recv error");
                exit(1);
            }else if(ret ==0 )
            {
               ev.data.fd=event[i].data.fd;
               ev.events=EPOLLIN;
                epoll_ctl(epfd,EPOLL_CTL_DEL,event[i].data.fd,&ev);
		close(event[i].data.fd);
            }
            printf("%d recv %s \n",event[i].data.fd,readbuf);
            memset(readbuf,0,sizeof(readbuf));
        }
    }
}




}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值