epoll边缘触发_C++回声服务器_9-epoll边缘触发模式版本服务器

epoll默认情况下是水平触发模式,这次将epoll设置为边缘触发模式来实现服务器,而客户端直接使用完美回声服务器的客户端。

服务器代码

#include

#include

#include

#include

#include

#include

#include

#include

#include

const int BUF_SIZE = 4;

const int EPOLL_SIZE = 50;

void setnonblockingmode(int fd);

void error_handling(const char *buf);

int main(int argc, char *argv[]) {

int server_sock, client_sock;

sockaddr_in server_addr, client_addr;

socklen_t addr_size;

ssize_t str_len;

int i;

char buf[BUF_SIZE];

epoll_event *ep_events;

epoll_event event;

int epfd, event_cnt;

if (argc != 2) {

printf("Usage : %s \n", argv[0]);

exit(1);

}

server_sock = socket(PF_INET, SOCK_STREAM, 0);

memset(&server_addr, 0, sizeof(server_addr));

server_addr.sin_family = AF_INET;

server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

server_addr.sin_port = htons(atoi(argv[1]));

if (bind(server_sock, (sockaddr*)&server_addr, sizeof(server_addr)) == -1) {

error_handling("bind() error");

exit(1);

}

if (listen(server_sock, 5) == -1) {

error_handling("listen() error");

}

epfd = epoll_create(EPOLL_SIZE);

ep_events = (epoll_event*)malloc(sizeof(epoll_event) * EPOLL_SIZE);

event.events = EPOLLIN;

event.data.fd = server_sock;

epoll_ctl(epfd, EPOLL_CTL_ADD, server_sock, &event);

while (1) {

event_cnt = epoll_wait(epfd, ep_events, EPOLL_SIZE, -1);

if (event_cnt == -1) {

puts("epoll_wait() error");

break;

}

for (int i = 0; i < event_cnt; ++i) {

if (ep_events[i].data.fd == server_sock) {

addr_size = sizeof(client_addr);

client_sock = accept(server_sock, (sockaddr*)&client_addr, &addr_size);

setnonblockingmode(client_sock); // 设置client socket为非阻塞模式

event.events = EPOLLIN | EPOLLET; // 设置epoll边缘触发

event.data.fd = client_sock;

epoll_ctl(epfd, EPOLL_CTL_ADD, client_sock, &event);

printf("connect client: %d\n", client_sock);

} else {

while (1) { // 将数据读完为止

str_len = read(ep_events[i].data.fd, buf, BUF_SIZE);

if (str_len == 0) {

epoll_ctl(epfd, EPOLL_CTL_DEL, ep_events[i].data.fd, NULL);

close(ep_events[i].data.fd);

printf("closed client: %d\n", ep_events[i].data.fd);

} else if (str_len < 0) {

if (errno == EAGAIN) { // 已无数据

break;

}

}

else {

write(ep_events[i].data.fd, buf,str_len);

}

}

}

}

}

close(server_sock);

close(epfd);

return 0;

}

// 将文件描述符设置为非阻塞

void setnonblockingmode(int fd) {

int flag = fcntl(fd, F_GETFL, 0);

fcntl(fd, F_SETFL, flag | O_NONBLOCK);

}

项目代码

参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用dbstart和dbshut脚本自动启动和停止数据库的问题

客户的两台IBM Power 740小型机使用HACMP软件创建互备关系的数据库服务器&#xff0c;每台小型机运行一个数据库&#xff0c;任何一台服务器出现故障宕机&#xff0c;另一台小型机应该立即接管&#xff0c;且要一并接管数据库&#xff0c;这时在一台小型机上就运行了两个数据库…

在Windows下不使用密码远程登陆Linux

在登陆Linux进行管理的时候我们通常会使用用户名和密码进行登陆&#xff0c;这样一来是比较麻烦&#xff0c;二来是不安全&#xff0c;为了解决这个问题&#xff0c;我们可以使用公私钥 (public keys和private keys)进行认证。简单来说公钥存放在服务器上&#xff0c;私钥存放在…

dto 是只给前端需要的数据吗_DO、VO、DTO...XXOO,你弄明白了么

技术公众号&#xff1a;Java In Mind(Java_In_Mind),欢迎关注&#xff01;背景我相信&#xff0c;刚开始学习接触企业代码的时候&#xff0c;一定会发现&#xff0c;工程中充斥着各种XO&#xff1a;DO、VO、DTO、DAO&#xff0c;还有各种名词&#xff1a;POJO&#xff0c;JavaB…

Javascript判断object还是list/array的类型(包含javascript的数据类型研究)

前提&#xff1a;先研究javascript中的变量有几种&#xff0c;参考&#xff1a; http://www.w3school.com.cn/js/js_datatypes.asp http://glzaction.iteye.com/blog/1285147 测试1&#xff1a; typeof关键字 var obj {test:test}; typeof obj;//输出object var list [{test:t…

Core Data

简介 Core Data是iOS5之后才出现的一个框架&#xff0c;它提供了对象-关系映射(ORM)的功能&#xff0c;即能够将OC对象转化成数据&#xff0c;保存在SQLite数据库文件中&#xff0c;也能够将保存在数据库中的数据还原成OC对象。在此数据操作期间&#xff0c;我们不需要编写任何…

tbase同步mysql_mysql主从同步

MySQL主从介绍MySQL主从叫做Replication、AB复制&#xff0c;A和B做主从后&#xff0c;在A上写数据。B上也会同步A的数据&#xff0c;两者实现实时同步MySQL是基于binlog日志来同步的&#xff0c;主上必须开启binlog才能进行主从同步&#xff0c;同步过程大概有三个步骤(1)主将…

2017将转行进行到底

2016 年说着转行&#xff0c;最后还是在匆匆中找了一份老本行&#xff0c;此刻的心情还是无爱&#xff0c;毕竟螺丝一直分不清啊&#xff0c;不喜欢就是不喜欢。看了django的教程&#xff0c;不得不感叹国外的书写的相对优秀一点&#xff0c;《learning django web development…

mysql中函数是否可以返回多个值_是否可以从mysql函数返回多个值?

我的脏解决方案是&#xff1a;1.连接字符串中的值. 2返回字符串. 3 Splits将字符串返回值.我认为它不优雅,我确信这有局限性,但它适用于简单的情况还有必要创建分裂函数,因为Mysql没有这个函数&#xff1a;首先编辑你的功能.CREATE FUNCTION yourFunctionWith2valuesForReturni…

lua自定义迭代器

迭代器 http://www.tutorialspoint.com/lua/lua_iterators.htm 迭代器能够让你遍历某个集合或者容器中的每一个元素。 对于lua来说&#xff0c; 集合通常指代 table&#xff0c; 用于创建变化的数据结构&#xff0c; 类似数组。 Iterator is a construct that enables you to t…

mysql非主键索引_主键索引和非主键索引的区别

1. 什么是最左前缀原则&#xff1f;以下回答全部是基于MySQL的InnoDB引擎例如对于下面这一张表如果我们按照 name 字段来建立索引的话&#xff0c;采用B树的结构&#xff0c;大概的索引结构如下如果我们要进行模糊查找&#xff0c;查找name 以“张"开头的所有人的ID&#…

优美的配色方案设计

2019独角兽企业重金招聘Python工程师标准>>> 怎么做好设计配色一直是个难题&#xff0c;虽然网站上有各种各样的色库&#xff0c;但配色仍然至关重要&#xff0c;不得已的话可以亲自动手&#xff0c;况且乐趣满满。 这个没有一套标准&#xff0c;所以看自己怎么喜欢…

It's a start!

开始博客之旅转载于:https://www.cnblogs.com/catchingdream/p/5843172.html

mysql死锁释放时间参数_【Mysql】mysql 事务未提交导致死锁 Lock wait timeout exceeded; try restarting transaction 解决办法...

问题场景问题出现环境&#xff1a;1、在同一事务内先后对同一条数据进行插入和更新操作&#xff1b;2、多台服务器操作同一数据库&#xff1b;3、瞬时出现高并发现象&#xff1b;不断的有一下异常抛出&#xff0c;异常信息&#xff1a;org.springframework.dao.CannotAcquireLo…

ORACLE sqlplus设置行数和宽度

1) 查看目前的pagesize,默认是14:Sqlplus代码show pagesize; 2) 将pagesize设置好100,则可以一次显示够多行记录了:Sqlplus代码set pagesize 100; 2. 设置行的宽度1) 查看目前的linesize,默认是80:Sqlplus代码show linesize; 2) 设置成100或者更宽都可以:Sqlplus代码set li…

mysql关系模式怎么画_关系数据库与mysql

表下面是阿里的mysql设计原则&#xff0c;可以参考&#xff0c;不一定按照阿里规则&#xff0c;但一个团队一定要有规则&#xff0c;如果现在没有规则&#xff0c;从现在开始&#xff0c;慢慢推广&#xff0c;适应1.【强制】表达是与否概念的字段&#xff0c;必须使用 is_xxx的…

Javascript 构造函数模式、原型模式

前两天写完组合继承&#xff0c;打算总结一下原型继承的&#xff0c;不过今天看了一下工厂模式、构造函数模式和原型模式&#xff0c;觉得有必要总结一下以加深印象。 ———————————————————————————————————————————————————…

2016年CCF第七次测试 俄罗斯方块

1 //2016年CCF第七次测试 俄罗斯方块2 // 这道小模拟题还是不错3 // 思路&#xff1a;处理出输入矩阵中含1格子的行数和列数4 // 再判是否有一个格子碰到底部&#xff0c;否则整体再往下移动一步&#xff0c;如果有一个格子不能移动&#xff0c;要返回到前一步5 6 #include <…

springmvc视图解析器_SpringMVC视图及REST风格

什么是视图解析器&#xff1f;springMVC用于处理视图最重要的两个接口是ViewResolver和View。ViewResolver的主要作用是把一个逻辑上的视图名称解析成一个真的的视图&#xff0c;而SpringMVC中用于把View对象呈现给客户端的是View对象本身&#xff0c;而ViewResolver只是把逻辑…

mysql5.7.x 1251_MySql-8.0.x免安装版下载与配置,Navicat打开数据库链接报错1251的解决办法...

概述MySQL从5.7一下子跳到了MySQL8.0, 其中的变化必然是很大的, 这里就不说了, 本文主要讲解最新版MySQL安装的事情.实际上5.7版本后的mysql免安装版都是没有data文件和my.ini文件的&#xff0c;下面再具体说明怎么生成&#xff0c;注意不能自己手动新建.下载下载程序必然去官网…

To install 64-bit ODBC drivers

为了更充分的利用硬件资源&#xff0c;我想很多人都开使用64位操作系统了&#xff0c;同时你可以也发现了在64位操作系统上ODBC的驱动找不到了&#xff0c;所以ODBC的东西都没法用了。 因为2007以前版本的Office只有32位版本&#xff0c;所以我们不能在64位系统上使用ODBC。使用…