c/c++ linux epoll系列3 利用epoll_wait设置timeout时间长度
linux epoll系列3 利用epoll_wait设置timeout时间长度
epoll_wait函数的第四个参数可以设置,epoll_wait函数的等待时间(timeout时间长度)。
例子1,是接收端。
例子2,是发送端。
例子1,接收端
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/epoll.h>
#include <arpa/inet.h>
#define EVENTS 12
int main(){
int sock1, sock2;
sockaddr_in addr1, addr2;
int epfd;
epoll_event ev, ev_ret[EVENTS];
char buf[2048];
int i;
int nfds;
int n;
//创建2个接受消息的socket
sock1 = socket(AF_INET, SOCK_DGRAM, 0);
sock2 = socket(AF_INET, SOCK_DGRAM, 0);
addr1.sin_family = AF_INET;
addr2.sin_family = AF_INET;
inet_pton(AF_INET, "127.0.0.1", &addr1.sin_addr.s_addr);
inet_pton(AF_INET, "127.0.0.1", &addr2.sin_addr.s_addr);
addr1.sin_port = htons(11111);
addr2.sin_port = htons(22222);
bind(sock1, (sockaddr*)&addr1, sizeof(addr1));
bind(sock2, (sockaddr*)&addr2, sizeof(addr2));
//参数不小于0就行
epfd = epoll_create(1);
if(epfd < 0){
perror("epoll_create");
return 1;
}
memset(&ev, 0, sizeof(ev));
ev.events = EPOLLIN;//只读
ev.data.fd = sock1;//把sock1加到epoll
if(epoll_ctl(epfd, EPOLL_CTL_ADD, sock1, &ev) != 0){
perror("epoll_ctl");
return 1;
}
memset(&ev, 0, sizeof(ev));
ev.events = EPOLLIN;//只读
ev.data.fd = sock2;//把sock2加到epoll
if(epoll_ctl(epfd, EPOLL_CTL_ADD, sock2, &ev) != 0){
perror("epoll_ctl");
return 1;
}
while(1){
printf("before epoll_wait\n");
//在这里会阻塞,只等待10秒,超过10秒,epoll_wait函数结束,返回0给nfds.
nfds = epoll_wait(epfd, ev_ret, EVENTS, 10*1000);
if(nfds < 0){
perror("epoll_wait");
return 1;
}
printf("after epoll_wait\n");
if(nfds == 0){
printf("timeout\n");
break;
}
for(i = 0; i < nfds; ++i){
//判断进来的socket是哪个socket
if(ev_ret[i].data.fd == sock1){
//从sock1读取数据,并写入到标准输出
n = recv(sock1, buf, sizeof(buf), 0);
write(fileno(stdout), buf, n);
}
//判断进来的socket是哪个socket
else if(ev_ret[i].data.fd == sock2){
//从sock1读取数据,并写入到标准输出
n = recv(sock2, buf, sizeof(buf), 0);
write(fileno(stdout), buf, n);
}
}
}
close(sock1);
close(sock2);
return 0;
}
例子2, 是发送端。
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/epoll.h>
#include <arpa/inet.h>
int main(){
int sock;
sockaddr_in dest1, dest2;
char buf[1024];
sock = socket(AF_INET, SOCK_DGRAM, 0);
dest1.sin_family = AF_INET;
dest2.sin_family = AF_INET;
inet_pton(AF_INET, "127.0.0.1", &dest1.sin_addr.s_addr);
inet_pton(AF_INET, "127.0.0.1", &dest2.sin_addr.s_addr);
dest1.sin_port = htons(11111);
dest2.sin_port = htons(22222);
strcpy(buf, "data to port 11111\n");
//给地址1(dest1)送信
sendto(sock, buf, strlen(buf), 0, (sockaddr*)&dest1, sizeof(dest1));
strcpy(buf, "data to port 22222\n");
//给地址2(dest2)送信
sendto(sock, buf, strlen(buf), 0, (sockaddr*)&dest2, sizeof(dest1));
close(sock);
return 0;
}
运行方法:先运行接收端,再运行发送端。
c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854
c/c++ linux epoll系列3 利用epoll_wait设置timeout时间长度的更多相关文章
- c/c++ linux epoll系列2 利用epoll_wait查看是否可以送信
linux epoll系列2 利用epoll_wait查看是否可以送信 write函数本来是非阻塞函数,但是当缓存区被写满后,再往缓存区里写的时候,就必须等待缓存区再次变成可写,所以这是write就变 ...
- c/c++ llinux epoll系列4 利用epoll_wait实现非阻塞的connect
llinux epoll系列4 利用epoll_wait实现非阻塞的connect connect函数是阻塞的,而且不能设置connect函数的timeout时间,所以一旦阻塞太长时间,影响用户的体验 ...
- c/c++ llinux epoll系列5 解除epoll_wait状态
linux epoll系列5 解除epoll_wait状态 有时候会有解除epoll_wait状态的需求. 实现方法: 1,给执行epoll_wait的程序发signal. 2,使用sockpair. ...
- c/c++ linux epoll系列1 创建epoll
linux epoll系列1 创建epoll 据说select和poll的弱点是,随着连接(socket)的增加,性能会直线下降. epoll不会随着连接(socket)的增加,性能直线下降. 知识点 ...
- Go基础系列:为select设置超时时间
Go channel系列: channel入门 为select设置超时时间 nil channel用法示例 双层channel用法示例 指定goroutine的执行顺序 After() 谁也无法保证某 ...
- Linux NIO 系列(04-4) select、poll、epoll 对比
目录 一.API 对比 1.1 select API 1.2 poll API 1.3 epoll API 二.总结 2.1 支持一个进程打开的 socket 描述符(FD)不受限制(仅受限于操作系统 ...
- Linux NIO 系列(04-3) epoll
目录 一.why epoll 1.1 select 模型的缺点 1.2 epoll 模型优点 二.epoll API 2.1 epoll_create 2.2 epoll_ctl 2.3 epoll_ ...
- Windows完成端口与Linux epoll技术简介
收藏自:http://www.cnblogs.com/cr0-3/archive/2011/09/09/2172280.html WINDOWS完成端口编程1.基本概念2.WINDOWS完成端口的特点 ...
- epoll 系列函数简介、与select、poll 的区别
一.epoll 系列函数简介 #include <sys/epoll.h> int epoll_create(int size); int epoll_create1(int flags) ...
随机推荐
- AttributeError: module 'pip' has no attribute 'main'
Pycharm在运行pip安装模块是报错如下: 解决方法: 找到安装路径下的packaging_tool.py文件修改如下: 我的路径为D:\Program Files\JetBrains\PyCha ...
- How does the vuejs add the query and walk the object?
让这个老实返回的页面添加特殊路由,这个页面常常都是登录注册.这次我们根据登录举例. 省略 { path:'/login?url=:url', name:'loginfirst', component: ...
- java基础(三)-----java的三大特性之多态
面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...
- .NET Core中的路由约束
背景介绍 上周给大家分享了Nancy in .NET Core学习笔记 - 路由之后, 就一直在考虑.NET Core能否实现和Nancy中一样的路由约束, 最近查阅了一下MSDN及一些国外博客, 发 ...
- 华为oj之字符串反转
题目: 字符串反转 热度指数:4940 时间限制:1秒 空间限制:32768K 本题知识点: 字符串 题目描述 写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串.例如: 输入描述: 输入N ...
- 【朝花夕拾】Android性能篇之(六)Android进程管理机制
前言 Android系统与其他操作系统有个很不一样的地方,就是其他操作系统尽可能移除不再活动的进程,从而尽可能保证多的内存空间,而Android系统却是反其道而行之,尽可能保留进程.An ...
- 深入理解Mybatis插件开发
背景 关于Mybatis插件,大部分人都知道,也都使用过,但很多时候,我们仅仅是停留在表面上,知道Mybatis插件可以在DAO层进行拦截,如打印执行的SQL语句日志,做一些权限控制,分页等功能:但对 ...
- Flask 启动报错 error: [Errno 10053]
首先这不是 Flask 库的异常,该报错经常出现在 Python2 中. 问题所在:Python2 中 SocketServer 模块的问题. 解决办法: 不要用自带的 Server,通过 gunic ...
- 深耕品质,腾讯WeTest《2018中国移动游戏质量白皮书》正式发布
本文由云+社区发表 作者:腾讯WeTest 原文链接:https://wetest.qq.com/lab/view/437.html 对于游戏行业的不少人来说,2018年是一个多事之秋. 放眼大局,游 ...
- [十一]JavaIO之DataInputStream 和 DataOutputStream
功能简介 DataInputStream和DataOutputStream 继承了各自的FilterInputStream以及FilterOutputStream 使用装饰器模式对InputStrea ...