資源簡介
Linux高性能服務器編程(高清PDF)+項目源碼(完整)
代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#define?MAX_EVENT_NUMBER?1024
static?int?pipefd[2];
int?setnonblocking(?int?fd?)
{
????int?old_option?=?fcntl(?fd?F_GETFL?);
????int?new_option?=?old_option?|?O_NONBLOCK;
????fcntl(?fd?F_SETFL?new_option?);
????return?old_option;
}
void?addfd(?int?epollfd?int?fd?)
{
????epoll_event?event;
????event.data.fd?=?fd;
????event.events?=?EPOLLIN?|?EPOLLET;
????epoll_ctl(?epollfd?EPOLL_CTL_ADD?fd?&event?);
????setnonblocking(?fd?);
}
void?sig_handler(?int?sig?)
{
????int?save_errno?=?errno;
????int?msg?=?sig;
????send(?pipefd[1]?(?char*?)&msg?1?0?);
????errno?=?save_errno;
}
void?addsig(?int?sig?)
{
????struct?sigaction?sa;
????memset(?&sa?‘\0‘?sizeof(?sa?)?);
????sa.sa_handler?=?sig_handler;
????sa.sa_flags?|=?SA_RESTART;
????sigfillset(?&sa.sa_mask?);
????assert(?sigaction(?sig?&sa?NULL?)?!=?-1?);
}
int?main(?int?argc?char*?argv[]?)
{
????if(?argc?<=?2?)
????{
????????printf(?“usage:?%s?ip_address?port_number\n“?basename(?argv[0]?)?);
????????return?1;
????}
????const?char*?ip?=?argv[1];
????int?port?=?atoi(?argv[2]?);
????int?ret?=?0;
????struct?sockaddr_in?address;
????bzero(?&address?sizeof(?address?)?);
????address.sin_family?=?AF_INET;
????inet_pton(?AF_INET?ip?&address.sin_addr?);
????address.sin_port?=?htons(?port?);
????int?listenfd?=?socket(?PF_INET?SOCK_STREAM?0?);
????assert(?listenfd?>=?0?);
????//int?nReuseAddr?=?1;
????//setsockopt(?listenfd?SOL_SOCKET?SO_REUSEADDR?&nReuseAddr?sizeof(?nReuseAddr?)?);
????ret?=?bind(?listenfd?(?struct?sockaddr*?)&address?sizeof(?address?)?);
????if(?ret?==?-1?)
????{
????????printf(?“errno?is?%d\n“?errno?);
????????return?1;
????}
????//assert(?ret?!=?-1?);
????ret?=?listen(?listenfd?5?);
????assert(?ret?!=?-1?);
????epoll_event?events[?MAX_EVENT_NUMBER?];
????int?epollfd?=?epoll_create(?5?);
????assert(?epollfd?!=?-1?);
????addfd(?epollfd?listenfd?);
????ret?=?socketpair(?PF_UNIX?SOCK_STREAM?0?pipefd?);
????assert(?ret?!=?-1?);
????setnonblocking(?pipefd[1]?);
????addfd(?epollfd?pipefd[0]?);
????//?add?all?the?interesting?signals?here
????addsig(?SIGHUP?);
????addsig(?SIGCHLD?);
????addsig(?SIGTERM?);
????addsig(?SIGINT?);
????bool?stop_server?=?false;
????while(?!stop_server?)
????{
????????int?number?=?epoll_wait(?epollfd?events?MAX_EVENT_NUMBER?-1?);
????????if?(?(?number?0?)?&&?(?errno?!=?EINTR?)?)
????????{
????????????printf(?“epoll?failure\n“?);
????????????break;
????????}
????
????????for?(?int?i?=?0;?i?????????{
????????????int?sockfd?=?events[i].data.fd;
????????????if(?sockfd?==?listenfd?)
????????????{
????????????????struct?sockaddr_in?client_address;
????????????????socklen_t?client_addrlength?=?sizeof(?client_address?);
????????????
評論
共有 條評論