#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/epoll.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<errno.h>
#include <netinet/tcp.h>
#include <pthread.h>
#include<string.h>
#include<stdlib.h>
#define MAX 500
int main(int argc,char* argv[])
{
if(argc<2){return -1;} int port=atoi(argv[1]);
int sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0){return -1;} struct sockaddr_in addr;
memset(&addr,0,sizeof(struct sockaddr_in));
addr.sin_family=AF_INET;
addr.sin_port=htons(port);
addr.sin_addr.s_addr=INADDR_ANY; if(bind(sockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in))<0)
{
printf("绑定端口失败!\n");
return -1;
}
if(listen(sockfd,5)<0)
{
return -1;
} int epfd=epoll_create(1); struct epoll_event ev,events[MAX]={0};
ev.events=EPOLLIN;
ev.data.fd=sockfd;
epoll_ctl(epfd,EPOLL_CTL_ADD,sockfd,&ev); while(1)
{
int nready=epoll_wait(epfd,events,500,-1);
for(int i=0;i<nready;i++)
{
if(events[i].events&EPOLLIN)
{
if(events[i].data.fd==sockfd)
{
struct sockaddr_in client_addr;
memset(&client_addr,0,sizeof(struct sockaddr_in));
socklen_t client_len=sizeof(client_addr);
int clientfd=accept(sockfd,(struct sockaddr*)&client_addr,&client_len);
char str[12];
printf("recv from %s at port %d\n", inet_ntop(AF_INET, &client_addr.sin_addr, str, sizeof(str)),
ntohs(client_addr.sin_port)); ev.events=EPOLLIN|EPOLLET;
ev.data.fd=clientfd;
epoll_ctl(epfd,EPOLL_CTL_ADD,clientfd,&ev);
}
else
{
char buf[1024]={0};
int clientfd=events[i].data.fd;
int n=recv(clientfd,buf,sizeof(buf),0);
//非阻塞情况下,当缓冲区没有数据的时候,会返回-1
if(n<0)
{
if(errno==EAGAIN||errno==EWOULDBLOCK)//其他情况的异常,errno会有相应的标志,这是正常情况下的错误
{
continue;
}
close(clientfd);
ev.events=EPOLLIN;
ev.data.fd=clientfd;
epoll_ctl(epfd,EPOLL_CTL_DEL,clientfd,&ev); }else if(n==0) //客户端与服务器端断开的时候
{ /*高并发短连接的TCP服务器上,当服务器处理完请求后立刻主动正常关闭连接。
这个场景下会出现大量socket处于TIME_WAIT状态。如果客户端的并发量持续
很高,此时部分客户端就会显示连接不上。
比如取一个web页面,1秒钟的http短连接处理完业务,在关闭连接之后,
这个业务用过的端口会停留在TIMEWAIT状态几分钟,而这几分钟,
其他HTTP请求来临的时候是无法占用此端口的(占着茅坑不拉翔)。
单用这个业务计算服务器的利用率会发现,服务器干正经事的时间
和端口(资源)被挂着无法被使用的时间的比例是 1:几百,服务器资源严重浪费。*/ printf("服务器与客户端断开连接\n");
//如果这里写了大量业务代码之后忘记关闭了clientfd,那么服务器端就会有大量close_wait状态
close(clientfd);
ev.events=EPOLLIN;
ev.data.fd=clientfd;
epoll_ctl(epfd,EPOLL_CTL_DEL,clientfd,&ev);
}
else
{
printf("接收到的数据为:%s,总共%d个字节\n",buf,n);
} } }
}
}
return 0;
}

epoll(1)的更多相关文章

  1. 从I/O复用谈epoll为什么高效

    上一篇文章中,谈了一些网络编程的基本概念.在现实使用中,用的最多的就是I/O复用了,无非就是select,poll,epoll 很多人提到网络就说epoll,认为epoll效率是最高的.单纯的这么认为 ...

  2. select、poll、epoll之间的区别总结

    select.poll.epoll之间的区别总结 05/05. 2014 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪 ...

  3. (转载) Linux IO模式及 select、poll、epoll详解

    注:本文是对众多博客的学习和总结,可能存在理解错误.请带着怀疑的眼光,同时如果有错误希望能指出. 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案 ...

  4. linux下select/poll/epoll机制的比较

    select.poll.epoll简介 epoll跟select都能提供多路I/O复用的解决方案.在现在的Linux内核里有都能够支持,其中epoll是Linux所特有,而select则应该是POSI ...

  5. epoll LT/ET 深度剖析

    EPOLL事件的两种模型: Level Triggered (LT) 水平触发 .socket接收缓冲区不为空 有数据可读 读事件一直触发 .socket发送缓冲区不满 可以继续写入数据 写事件一直触 ...

  6. 非阻塞/异步(epoll) openssl

    前段时间在自己的异步网络框架handy中添加openssl的支持,当时在网络上搜索了半天也没有找到很好的例子,后来自己慢慢的摸索,耗费不少时间,终于搞定.因此把相关的资料整理一下,并给出简单的例子,让 ...

  7. select,epoll,poll比较

    介绍和比较 http://www.cnblogs.com/maociping/p/5132583.html 比较 http://www.dataguru.cn/thread-336032-1-1.ht ...

  8. Linux epoll

    一. epoll函数集 epoll主要有三个函数: 1. int epoll_create(int size); 创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大.这个参数不同于 ...

  9. linux下epoll实现机制

    linux下epoll实现机制 原作者:陶辉 链接:http://blog.csdn.net/russell_tao/article/details/7160071 先简单回顾下如何使用C库封装的se ...

  10. select、poll、epoll之间的区别总结[整理]

    select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作.但select ...

随机推荐

  1. 【手把手教程】uniapp + vue 从0搭建仿斗鱼虎牙直播App:腾讯云MLVB移动直播实践连麦PK+带货

    基于uniapp + vue 实现仿斗鱼虎牙腾讯云移动直播应用实践,实现以下功能 1: 用户登陆 2: 房间管理 3: 房间聊天 4: 直播美颜 5: Svga礼物动画 6: 一对一连麦观众 项目开发 ...

  2. uniapp+nvue实现仿微信/得物相册插件:选择界面 +自定义相册+图片视频过滤

    本篇文章基于uniapp 框架+ nvue,实现了uniapp仿微信/得物相册选择功能实例项目,该插件实例实现了以下功能: 1: 相册过滤 2: 图视频过滤 3: 界面UI定制化 4: 栅格列数定制化 ...

  3. Python obj与JSON相互转换

    1 # _*_ coding:utf-8 _*_ 2 3 def showJson(self, pipefd): 4 overdict = args.__dict__ 5 # 此时就可以用json.d ...

  4. 【九度OJ】题目1196:成绩排序 解题报告

    [九度OJ]题目1196:成绩排序 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1196 题目描述: 用一维数组存储学号和成绩,然后 ...

  5. 一个网关服务性能问题的Dump分析

    本篇文章分为三部分,首先简单介绍一下分析的工具Windbg,其次针对一个网关服务性能问题进行逐步刨析,最后针对性能问题的分析总结. 一 Windbg介绍 1.Windbg是个非常强大的调试器,它设计了 ...

  6. Codeforces 876B:Divisiblity of Differences(数学)

    B. Divisiblity of Differences You are given a multiset of n integers. You should select exactly k of ...

  7. Insights直播回顾——手语服务,助力沟通无障碍

    HMS Core Insights第九期直播–手语服务,助力沟通无障碍,已于12月29日圆满结束,本期直播与小伙伴们一同了解了HMS Core手语服务的亮点特性.底层技术以及演进规划,下面我们一起来回 ...

  8. 使用 history 对象和 location 对象中的属性和方法制作一个简易的网页浏览工具

    查看本章节 查看作业目录 需求说明: 使用 history 对象和 location 对象中的属性和方法制作一个简易的网页浏览工具 实现思路: 使用history对象中的 forward() 方法和 ...

  9. 1.spring系列之优雅的实现接口统一返回

    好处 现在公司开发基本上都是以前后分离模式为主,所以要有个统一的数据格式,这样有什么好处呢? 能够提高前后端对接的效率(特别重要) 代码更加优雅和简洁 对于前端和后端维护更方便容易 实现(直接上代码) ...

  10. 来自MyBatis不一样收获结果的探索之旅-v3.5.9

    概述 定义 MyBatis官网 https://mybatis.org/mybatis-3/ 最新版本为3.5.9 MyBatis是一个的ORM框架,支持自定义SQL.存储过程和高级映射.MyBati ...