epoll,epoll_v1,epoll_v2,epoll_v3

//epoll
#include <stdlib.h>

#include <unistd.h>
#include <arpa/inet.h>

#include <errno.h>
#include <sys/epoll.h>

int main(int argc, char *argv[]) 
{
	int port = ::atoi(argv[1]);
    const char* ip = "127.0.0.1"; 

	int sockfd = ::socket(AF_INET, SOCK_STREAM, 0);

	sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = ::htons(port);
    ::inet_pton(AF_INET, ip, &addr.sin_addr);

	::bind(sockfd, (sockaddr*)&addr, sizeof(addr));

	::listen(sockfd, 128);

	int epollfd = ::epoll_create(1);
	
	epoll_event event, events[1024] = {0};
	event.events = EPOLLIN;
	event.data.fd = sockfd;
	
	::epoll_ctl(epollfd, EPOLL_CTL_ADD, sockfd, &event);
	
	while (true) 
	{
		// int nums = ::epoll_wait(epollfd, events, 1024, -1);
		int nums = ::epoll_wait(epollfd, events, 1024, 0);
		
		for (int i = 0;i < nums; i++) 
		{
			if (events[i].events & EPOLLIN) 
			{
				if (events[i].data.fd == sockfd) 
				{
					sockaddr_in clientAddr;
					socklen_t clientLen = sizeof(clientAddr);
					
					int clientfd = ::accept(sockfd, (sockaddr*)&clientAddr, &clientLen);

					event.events = EPOLLIN | EPOLLET;
					event.data.fd = clientfd;
					::epoll_ctl(epollfd, EPOLL_CTL_ADD, clientfd, &event);
					
				} 
				else 
				{
					int clientfd = events[i].data.fd;

					char buffer[1024] = {0};
					int ret = ::recv(clientfd, buffer, 1024, 0);
                    ::send(clientfd, buffer, ret, 0);
				}

			}

			if (events[i].events & EPOLLOUT) {}

		}

	}

}




 

//epoll_v1
#include <stdlib.h>

#include <unistd.h>
#include <arpa/inet.h>

#include <errno.h>
#include <sys/epoll.h>

int sockfd;
int epollfd;
void handleEvents(epoll_event* events, int i)
{
    if (events[i].events & EPOLLIN)
    {
        if (events[i].data.fd == sockfd) 
        {
            sockaddr_in clientAddr;
            socklen_t clientLen = sizeof(clientAddr);
            
            int clientfd = ::accept(sockfd, (sockaddr*)&clientAddr, &clientLen);

            epoll_event event;
            event.events = EPOLLIN | EPOLLET;
            event.data.fd = clientfd;
            ::epoll_ctl(epollfd, EPOLL_CTL_ADD, clientfd, &event);
            
        } 
        else
        {
            int clientfd = events[i].data.fd;

            char buffer[1024] = {0};
            int ret = ::recv(clientfd, buffer, 1024, 0);
            ::send(clientfd, buffer, ret, 0);
        }

    }

	if (events[i].events & EPOLLOUT) {}
}

int main(int argc, char *argv[]) 
{
	int port = ::atoi(argv[1]);
    const char* ip = "127.0.0.1"; 

	sockfd = ::socket(AF_INET, SOCK_STREAM, 0);

	sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = ::htons(port);
    ::inet_pton(AF_INET, ip, &addr.sin_addr);

	::bind(sockfd, (sockaddr*)&addr, sizeof(addr));

	::listen(sockfd, 128);

	epollfd = ::epoll_create(1);
	
	epoll_event event;
	event.events = EPOLLIN | EPOLLOUT;
	event.data.fd = sockfd;
	
	::epoll_ctl(epollfd, EPOLL_CTL_ADD, sockfd, &event);
	
    epoll_event events[1024];
	while (true) 
	{
		int nums = ::epoll_wait(epollfd, events, 1024, 0);
		
		for (int i = 0;i < nums; i++) 
		{
			handleEvents(events, i);
		}

	}

}
//epoll_v2
#include <stdlib.h>

#include <unistd.h>
#include <arpa/inet.h>

#include <errno.h>
#include <sys/epoll.h>

const char* ip = "127.0.0.1";
int sockfd;
int epollfd;

sockaddr_in* inetAddr(int port)
{
    sockaddr_in* addr = new sockaddr_in;
	addr->sin_family = AF_INET;
	addr->sin_port = ::htons(port);
    ::inet_pton(AF_INET, ip, &addr->sin_addr);

    return addr;
}

int serverStart(sockaddr_in* addr)
{
    sockfd = ::socket(AF_INET, SOCK_STREAM, 0);

	::bind(sockfd, (sockaddr*)addr, sizeof(*addr));

	::listen(sockfd, 128);

    return sockfd;
}

void handleEvents(epoll_event* events, int i)
{
    if (events[i].events & EPOLLIN)
    {
        if (events[i].data.fd == sockfd)
        {
            sockaddr_in clientAddr;
            socklen_t clientLen = sizeof(clientAddr);
            
            int clientfd = ::accept(sockfd, (sockaddr*)&clientAddr, &clientLen);

            epoll_event event;
            event.events = EPOLLIN | EPOLLET;
            event.data.fd = clientfd;
            ::epoll_ctl(epollfd, EPOLL_CTL_ADD, clientfd, &event);
            
        } 
        else
        {
            int clientfd = events[i].data.fd;

            char buffer[1024] = {0};
            int ret = ::recv(clientfd, buffer, 1024, 0);
            ::send(clientfd, buffer, ret, 0);
        }

    }

	if (events[i].events & EPOLLOUT) {}
}

void eventloop(int sockfd)
{
    epollfd = ::epoll_create(1);
	
	epoll_event event;
	event.events = EPOLLIN | EPOLLOUT;
	event.data.fd = sockfd;
	
	::epoll_ctl(epollfd, EPOLL_CTL_ADD, sockfd, &event);
	
	while (true) 
	{
        epoll_event events[1024];
		int nums = ::epoll_wait(epollfd, events, 1024, 0);
		
		for (int i = 0;i < nums; i++)
		{
			handleEvents(events, i);
		}

	}
}

int main(int argc, char *argv[]) 
{
    auto addr = inetAddr(::atoi(argv[1]));

    int sockfd = serverStart(addr);
	
    eventloop(sockfd);

}
//epoll_v3
#include <stdlib.h>

#include <unistd.h>
#include <arpa/inet.h>

#include <errno.h>
#include <sys/epoll.h>

struct Context
{
    int sockfd;
    int epollfd;
};

sockaddr_in* inetAddr(int port)
{
    const char* ip = "127.0.0.1";

    sockaddr_in* addr = new sockaddr_in;
	addr->sin_family = AF_INET;
	addr->sin_port = ::htons(port);
    ::inet_pton(AF_INET, ip, &addr->sin_addr);

    return addr;
}

int serverStart(sockaddr_in* addr)
{
    int sockfd = ::socket(AF_INET, SOCK_STREAM, 0);

	::bind(sockfd, (sockaddr*)addr, sizeof(*addr));

	::listen(sockfd, 128);

    return sockfd;
}

void handleEvents(epoll_event* events, int i, int sockfd)
{
    Context* data = (Context*)events[i].data.ptr;

    if (events[i].events & EPOLLIN)
    {
        if (data->sockfd == sockfd)
        {
            sockaddr_in clientAddr;
            socklen_t clientLen = sizeof(clientAddr);
            
            int clientfd = ::accept(sockfd, (sockaddr*)&clientAddr, &clientLen);

            epoll_event event;
            event.events = EPOLLIN | EPOLLET;

            Context* context = new Context;
            context->sockfd = clientfd;
            context->epollfd = data->epollfd;

            event.data.ptr = context;

            ::epoll_ctl(data->epollfd, EPOLL_CTL_ADD, clientfd, &event);
            
        } 
        else
        {
            Context* data = (Context*)events[i].data.ptr;
            int clientfd = data->sockfd;

            char buffer[1024] = {0};
            int ret = ::recv(clientfd, buffer, 1024, 0);
            ::send(clientfd, buffer, ret, 0);
        }

    }

	if (events[i].events & EPOLLOUT) {}
}


void eventloop(int sockfd)
{
    int epollfd = ::epoll_create(1);
	
	epoll_event event;
	event.events = EPOLLIN | EPOLLOUT;
    
    Context* context = new Context;
    context->sockfd = sockfd;
    context->epollfd = epollfd;

    event.data.ptr = context;

	::epoll_ctl(epollfd, EPOLL_CTL_ADD, sockfd, &event);
	
	while (true) 
	{
        epoll_event events[1024];
		int nums = ::epoll_wait(epollfd, events, 1024, 0);

		for (int i = 0;i < nums; i++)
		{
			handleEvents(events, i, sockfd);
		}

	}
}

int main(int argc, char *argv[]) 
{
    auto addr = inetAddr(::atoi(argv[1]));

    int sockfd = serverStart(addr);
	
    eventloop(sockfd);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值