TCP IP网络编程:第17章 优于select的epoll

本章将介绍比select速度更快的epoll方法

一、基于select的I/O复用技术速度慢的原因

  1. 调用select函数后一般都有一个针对所有文件描述符的循环语句
  2. 每次调用select函数时都需要向该函数传递监视对象信息

 

二、select相比epoll的优点:

     大部分操作系统都支持select函数,而epoll函数只在Linux系统下提供支持

所以,在服务器接入者少且要求程序在不同系统上具有兼容性时,使用select更合适

 

三、epoll比select有哪些优点

  1. 无需编写以监视状态变化为目的的针对所有文件描述符的循环语句
  2. 调用对应于select函数的epoll_wait函数时,无需每次传递监视对象信息

 

四、epoll的使用

下面介绍epoll服务器端实现中需要的3个函数希望各位结合epoll函数的优点理解这些函数的功能

  • epoll_create:  创建保存epoll文件描述符的空间 
  • epoll_ctl:        向空间注册并注销文件名描述符
  • epoll_wait:      与select函数类似,等待文件描述符发生变化

 

写着写着电脑死机了,好几页都白写了,为了完成今天的任务,只好开始搬运模式了。。。

 

TCP IP网络编程:第17章 优于select的epoll_第1张图片

 

epoll_create

TCP IP网络编程:第17章 优于select的epoll_第2张图片

TCP IP网络编程:第17章 优于select的epoll_第3张图片

 

epoll_ctl

TCP IP网络编程:第17章 优于select的epoll_第4张图片

TCP IP网络编程:第17章 优于select的epoll_第5张图片

TCP IP网络编程:第17章 优于select的epoll_第6张图片

 

epoll_wait

TCP IP网络编程:第17章 优于select的epoll_第7张图片

 

五、基于epoll的回声服务器端

// echo_epollserv.c

#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define BUF_SIZE 100
#define EPOLL_SIZE 50
void error_handling(char *buf);

int main(int argc, char *argv[])
{
	int serv_sock, clnt_sock;
	struct sockaddr_in serv_adr, clnt_adr;
	socklen_t adr_sz;
	int str_len, i;
	char buf[BUF_SIZE];

	struct epoll_event *ep_events;
	struct epoll_event event;
	int epfd, event_cnt;

	if(argc!=2) {
		printf("Usage : %s \n", argv[0]);
		exit(1);
	}

	serv_sock=socket(PF_INET, SOCK_STREAM, 0);
	memset(&serv_adr, 0, sizeof(serv_adr));
	serv_adr.sin_family=AF_INET;
	serv_adr.sin_addr.s_addr=htonl(INADDR_ANY);
	serv_adr.sin_port=htons(atoi(argv[1]));
	
	if(bind(serv_sock, (struct sockaddr*) &serv_adr, sizeof(serv_adr))==-1)
		error_handling("bind() error");
	if(listen(serv_sock, 5)==-1)
		error_handling("listen() error");

	epfd=epoll_create(EPOLL_SIZE);
	ep_events=malloc(sizeof(struct epoll_event)*EPOLL_SIZE);

	event.events=EPOLLIN;
	event.data.fd=serv_sock;	
	epoll_ctl(epfd, EPOLL_CTL_ADD, serv_sock, &event);

	while(1)
	{
		event_cnt=epoll_wait(epfd, ep_events, EPOLL_SIZE, -1);
		if(event_cnt==-1)
		{
			puts("epoll_wait() error");
			break;
		}

		for(i=0; i

 

 

 

 

你可能感兴趣的:(TCP,IP网络编程)