epoll案例

#include <stdio.h>
#include <string.h>

#include <iostream>

#include <fcntl.h>

#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define LOCAL_AF            AF_INET
#define LOCAL_IP            "192.168.11.128"
#define LOCAL_PORT          8090

using namespace std;

//
static int setSocketNonBlock(const int socketFd)
{
    int ret(0);

int flags = fcntl(socketFd, F_GETFL, 0);
    if (-1 == flags)
    {
        perror("fcntl");
        return -1;
    }

flags |= O_NONBLOCK;
    ret = fcntl(socketFd, F_SETFL, flags);
    if (-1 == ret)
    {
        perror("fcntl");
        return -1;
    }

return 0;
}

// 禁用socket的linger功能
static int setSocketLingerOff(const int socketFd)
{
    int ret(0);

struct linger lingerVal;
    lingerVal.l_onoff = 1;
    lingerVal.l_linger = 0;
    ret = setsockopt(socketFd, SOL_SOCKET, SO_LINGER, &lingerVal, sizeof(struct linger));
    if (0 != ret)
    {
        perror("setsockopt");
        return -1;
    }

return 0;
}

static int create_and_bind()
{
    int ret(0);

struct addrinfo hints;
    struct addrinfo * result, * nextRes;

memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;
    ret = getaddrinfo(NULL, "8090", &hints, &result);
    if (0 != ret)
    {
        perror("getaddrinfo");
        return -1;
    }

int listenSocket(-1);
    for (nextRes = result; nextRes != NULL; nextRes = nextRes->ai_next)
    {
        /*
        char ipBuf[1024];
        switch(nextRes->ai_family)
        {
        case AF_INET:
            inet_ntop(AF_INET, &(((sockaddr_in *)(nextRes->ai_addr))->sin_addr), ipBuf, sizeof(ipBuf));
            break;
        case AF_INET6:
            inet_ntop(AF_INET6, &(((sockaddr_in6 *)(nextRes->ai_addr))->sin6_addr), ipBuf, sizeof(ipBuf));
            break;
        }
        cout << "ipBuf: " << ipBuf << endl;
        */
        listenSocket = socket(nextRes->ai_family, nextRes->ai_socktype, nextRes->ai_protocol);
        if (-1 == listenSocket)
        {
            perror("socket");
            continue;
        }

ret = bind(listenSocket, nextRes->ai_addr, nextRes->ai_addrlen);
        if (0 != ret)
        {
            perror("bind");
            close(listenSocket);
            continue;
        }
        break;
    }

if (nextRes == NULL)
    {
        perror("create_and bind");
        return -1;
    }

freeaddrinfo(result);

return listenSocket;
}

int main(int argc, char **argv)
{
    create_and_bind();

return 0;
}

时间: 2024-10-27 08:02:02

epoll案例的相关文章

epoll模型的探索与实践

前言 我们知道nginx的效率非常高,能处理上万级的并发,其之所以高效离不开epoll的支持, epoll是什么呢?,epoll是IO模型中的一种,属于多路复用IO模型; 到这里你应该想到了,select,的确select也是一种多路复用的IO模型,但是其单个select最多只能同时处理1024个socket,效率实在算不上高,这时候epoll来救场了 本文从阻塞IO模型的基础上展开讨论,一步步靠近epoll的实现原理,最后以一个简单的epoll案例程序作为结束 亲手写一个epoll,然后去虐面

编写案例分别使用多进程、多路复用(select、epoll)实现tcp服务

-------------------------------多进程的tcp服务器-------------------------------通过为每个客户创建一个进程的方式,能够同时为多个客户进行服务器当客户不是特别多的时候,这种方式还行,如果有几百上千个,就不可取了,因为每次创建进程等过程需要好较大的资源 python代码案例: 1 #coding=utf-8 2 3 #引用对应的包 4 from socket import * 5 6 from multiprocessing impor

3高并发服务器:多路IO之epoll

 1 epoll epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并.发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符集合来传递结果而不用迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了. 目前epell是linux大规模并发网络程序中的热门首选模型. epoll除了提供s

nginx整合tomcat集群并做session共享----测试案例

最近出于好奇心,研究了一下tomcat集群配置,并整合nginx,实现负载均衡,session共享,写篇记录,防止遗忘.---------菜鸡的自我修炼. 说明:博主采用一个web项目同时部署到两台tomcat下,(tomcat-A,tomca-B),使用nginx做反向代理,按照设置的权值,将请求分发到后台的tomcatA/tomcat-B,并且实现session共享. 配置好本地域名指向:修改host文件:添加 127.0.0.1  www.domain.com.cn 新建项目:tiny-d

3高并发server:多路IO之epoll

 1 epoll epoll是Linux下多路复用IO接口select/poll的增强版本号,它能显著提高程序在大量并.发连接中仅仅有少量活跃的情况下的系统CPU利用率,由于它会复用文件描写叙述符集合来传递结果而不用迫使开发人员每次等待事件之前都必须又一次准备要被侦听的文件描写叙述符集合,还有一点原因就是获取事件的时候,它无须遍历整个被侦听的描写叙述符集,仅仅要遍历那些被内核IO事件异步唤醒而增加Ready队列的描写叙述符集合即可了. 眼下epell是linux大规模并发网络程序中的热门首选

web站点优化之使用tengine搭建静态资源服务器和静态资源合并加载案例剖析

在一个项目还是单体架构的时候,所有的js,css,image都会在一个web网站上,看起来并没有什么问题,比如下面这样: 但是当web网站流量起来的时候,这个单体架构必须要进行横向扩展,而在原来的架构中静态资源这羊毛是出在单体架构这头羊身上,所以横向多少 个单体,就有多少个静态资源文件夹,比如下面这样的架构. 那这种架构有什么问题呢? 总的来说会有如下二个问题: 1.   浏览器对单一域名的请求有并发限制. 在同一个域名下,一般来说有js,css,img,media,html等等静态资源,如果资

Linux下的I/O复用与epoll详解

前言 I/O多路复用有很多种实现.在linux上,2.4内核前主要是select和poll,自Linux 2.6内核正式引入epoll以来,epoll已经成为了目前实现高性能网络服务器的必备技术.尽管他们的使用方法不尽相同,但是本质上却没有什么区别.本文将重点探讨将放在EPOLL的实现与使用详解. 为什么会是EPOLL select的缺陷 高并发的核心解决方案是1个线程处理所有连接的“等待消息准备好”,这一点上epoll和select是无争议的.但select预估错误了一件事,当数十万并发连接存

《SaltStack技术入门与实践》—— 实践案例 &lt;中小型Web架构&gt;3 Memcached配置管理

实践案例 <中小型Web架构>3 Memcached配置管理 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东 Memcached介绍 Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态数据库驱动网站的访问速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通

UDT中epoll对CLOSE状态的处理

epoll_wait()返回可用uid时,对uid取状态,本该是BROKEN的,却取到CLOSED,然而,不能像处理BROKEN事件那样处理CLOSED事件,这样移除不了CLOSED事件,于是epoll_wait不断返回该uid,就造成了死循环.跟踪代码至底层,寻找原因. int CUDTUnited::epoll_remove_usock(const int eid, const UDTSOCKET u) { int ret = m_EPoll.remove_usock(eid, u); CU