一、epoll服务器
#include<iostream>
#include<list>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/epoll.h>
using namespace std;
网络socket通信必要的头文件,其中使用到了C++ STL顺序容器中的双向链表——list
// 存放客户端socket描述符的list
list<int> clients_list;
//两个函数宏定义:检查和赋值并检查
#define CHK(eval) if(eval<0) {perror("eval error!");exit(-1);}
#define CHK2(res,eval) if((res=eval)<0) {perror("eval2 error!");exit(-1);}
//几个方便拓展的宏定义
#define SERVER_ADDRESS "192.168.2.2"
#define SERVER_PORT 8000
#define BUFF_SIZE 1024
#define EPOLL_SIZE 100
#define EPOLL_RUN_TIMEOUT -1
//函数原型声明
int socket_bind(const char* ip,int port);
void do_epoll(int listenfd);
void add_epollfd(int epollfd,int fd,int state);
void delete_epollfd(int epollfd,int fd,int state);
int handle_message(int epollfd,int client);
定义了一些宏和函数原型声明,其中“list<int>”用来存储客户端连接返回的文件描述符
int main(int argc, char** argv)
{
int listenfd;
CHK2(listenfd,socket_bind(SERVER_ADDRESS,SERVER_PORT));
//监听
CHK(listen(listenfd,10));
do_epoll(listenfd);
return 0;
}
socket服务器端epoll实现的概要设计
int socket_bind(const char* ip,int port)
{
int listenfd;
struct sockaddr_in server_addr;
//初始化IPv4地址
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family=AF_INET;
inet_pton(AF_INET,ip,&server_addr.sin_addr.s_addr);
//server_addr.sin_addr.s_addr=htol(INADDR_ANY);
server_addr.sin_port=htons(SERVER_PORT)