socket多个客户端连接服务器【下】:epoll服务器&select客户端

一、epoll服务器

#include
#include

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

using namespace std;

网络socket通信必要的头文件,其中使用到了C++ STL顺序容器中的双向链表——list

// 存放客户端socket描述符的list
list 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 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);

    //创建socket
    CHK2(listenfd,socket(AF_INET,SOCK_STREAM

你可能感兴趣的:(linux,C语言编程环境,Linux,Socket)