//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);
}