UDP信号驱动IO
SIGIO信号
信号驱动式I/O不适用于TCP套接字, 因为产生的信号过于频繁且不能准确判断信号产生的原因.
设置信号驱动需把sockfd的非阻塞与信号驱动属性都打开
server
sockfd单独提出来作为全局变量, 便于sig_io处理函数访问
num变量用于设置当前可读数据报数量
struct data结构作为信号处理函数中保存客户端信息的记录地址
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define MAXLINE 1024
#define SERV_PORT 5555
void err_quit(const char *s){
perror(s);
exit(1);
}
int sockfd;
struct data{
struct sockaddr addr;
char data[1024];
}DATA;
static int num=0;
void sig_io(int signo){
ssize_t nread;
char *buff=DATA.data;
int size=sizeof(DATA.data);
socklen_t slen=sizeof(DATA.addr);
nread=recvfrom(sockfd,buff,size,0,&DATA.addr,&slen);
if(nread < 0){
if(errno == EWOULDBLOCK)
return;
else
err_quit("recvfrom");
}
buff[nread]=0;
num++;
}
int main(int argc,char *argv[]){
struct sockaddr_in servaddr;
sockfd=socket(AF_INET,SOCK_DGRAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(SERV_PORT);
if(bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) < 0)
err_quit("bind");
int on = 1;
signal(SIGIO,sig_io);
fcntl(sockfd,F_SETOWN,getpid());
ioctl(sockfd,FIOASYNC,&on);
ioctl(sockfd,FIONBIO,&on);
sigset_t zeromask,newmask,oldmask;
sigemptyset(&zeromask);
sigemptyset(&newmask);
sigemptyset(&oldmask);
sigaddset(&newmask,SIGIO);
sigprocmask(SIG_BLOCK,&newmask,&oldmask);
for(;;){
while(num == 0)
sigsuspend(&zeromask);
sigprocmask(SIG_SETMASK,&oldmask,NULL);
sendto(sockfd,DATA.data,strlen(DATA.data),0,&DATA.addr,sizeof(DATA.addr));
sigprocmask(SIG_BLOCK,&newmask,&oldmask);
if(num > 0)
num--;
}
return 0;
}
客户端
客户端只要实现发送一次然后接受一次即可, 略
UDP信号驱动IO的更多相关文章
- Linux 网络编程的5种IO模型:信号驱动IO模型
Linux 网络编程的5种IO模型:信号驱动IO模型 背景 上一讲 Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 我们讲解了多路复用等方面的知识,以及有关例程. ...
- 《Linux/UNIX系统编程手册》第63章 IO多路复用、信号驱动IO以及epoll
关键词:fasync_helper.kill_async.sigsuspend.sigaction.fcntl.F_SETOWN_EX.F_SETSIG.select().poll().poll_wa ...
- 信号驱动IO
[1]信号驱动IO 应用程序:1)应用程序要捕捉SIGIO信号 signal(SIGIO, handler); 2)应用程序要指定进程为文件的属主,设置当前的文件描述为当前的调用进 ...
- 【网络IO系列】IO的五种模型,BIO、NIO、AIO、IO多路复用、 信号驱动IO
前言 在上一篇文章中,我们了解了操作系统中内核程序和用户程序之间的区别和联系,还提到了内核空间和用户空间,当我们需要读取一条数据的时候,首先需要发请求告诉内核,我需要什么数据,等内核准备好数据之后 , ...
- 【死磕NIO】— 阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO,这你真的分的清楚吗?
通过上篇文章([死磕NIO]- 阻塞.非阻塞.同步.异步,傻傻分不清楚),我想你应该能够区分了什么是阻塞.非阻塞.异步.非异步了,这篇文章我们来彻底弄清楚什么是阻塞IO,非阻塞IO,IO复用,信号驱动 ...
- IO的多路复用和信号驱动
Linux为多路复用IO提供了较多的接口,有select(),pselect(),poll()的方式,继承自BSD和System V 两大派系. select模型比较简单,“轮询”检测fd_set的状 ...
- IO模型浅析-阻塞、非阻塞、IO复用、信号驱动、异步IO、同步IO
最近看到OVS用户态的代码,在接收内核态信息的时候,使用了Epoll多路复用机制,对其十分不解,于是从网上找了一些资料,学习了一下<UNIX网络变成卷1:套接字联网API>这本书对应的章节 ...
- udp套接字使用信号驱动式I/O
信号驱动式I/O的本质就是:进程预先告知内核当某个描写叙述符发生事件时,内核会向该进程发送SIGIO信号通知进程,进程可在信号处理函数中进行处理 进程能够通过fcntl打开O_ASYNC标志或ioct ...
- 🍛 餐厅吃饭版理解 IO 模型:阻塞 / 非阻塞 / IO 复用 / 信号驱动 / 异步
IO 概念 一个基本的 IO,它会涉及到两个系统对象,一个是调用这个 IO 的进程对象,另一个就是系统内核 (kernel).当一个 read 操作发生时,它会经历两个阶段: 通过 read 系统调用 ...
随机推荐
- 用HTTP核心模块配置一个静态Web服务器
静态Web服务器的主要功能由ngx_http_core_module模块(HTTP框架的主要成员)实现与core模块类似,可以根据相关模块(如ngx_http_gzip_filter_module.n ...
- 二分图最大匹配(匈牙利算法)简介& Example hdu 1150 Machine Schedule
二分图匹配(匈牙利算法) 1.一个二分图中的最大匹配数等于这个图中的最小点覆盖数 König定理是一个二分图中很重要的定理,它的意思是,一个二分图中的最大匹配数等于这个图中的最小点覆盖数.如果你还不知 ...
- poj 3714 Raid(平面最近点对)
Raid Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7473 Accepted: 2221 Description ...
- Codeforces 920 反图联通块 线段树质因数暴力
A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #def ...
- pandas 的axis参数的理解
# pandas的axis参数怎样理解? # axis=0 或者 "index": # 如果是单行操作,就指的是某一行 # 如果是聚合操作,指的是跨行cross rows # ax ...
- Sublime3 配置node.js 环境 The process "node.exe" not found
配置中文显示调试结果 [下载地址](https://github.com/tanepiper/SublimeText-Nodejs) 1. 到上述地址下载压缩文件 2.将文件解压到sublime的插件 ...
- git log 详解 以及代码量统计
https://git-scm.com/book/zh/v1/Git-%E5%9F%BA%E7%A1%80-%E6%9F%A5%E7%9C%8B%E6%8F%90%E4%BA%A4%E5%8E%86% ...
- Dynamic len
题目 有n个数编号从0→n-1,两种操作: Q L R:询问编号为L→R-1的数中共有多少种不同的数 M X Y:将编号为X的数改为Y 共有m个操作 分析 既然是单点修改,查询,我们考虑一下分块. 首 ...
- 使用struts2的内置标签,采用submit()提交表单时,浏览器报404
如图 url是没有问题的,结果我将提交方式改为get时,发现有2个参数的name值是一样的,如下图, 解决方法:将name的值修改就OK了.
- kibana的安装和监控
1.1:kibana搭建 kibana只需要在一台机器安装即可 1):解压 tar -zxvf kibana-5.5.2-linux-x86_64.tar.gz -C /home/angel/serv ...