异步信号驱动IO实现回射服务器

信号驱动I/O实例 4,信号驱动I/O :让内核在描述字就绪时发送SIGIO信号通知我们。首先开启套接口的信号驱动1/O功能,sigaction系统调用安装一个信号处理函数, 当内核数据包准备好时,会为该进程产生一个SIGIO信号。应用可以在信号处理时接收数据。  具体步骤:1,建立SIGIO信号处理函数。  2,设置该套接口的属主,通常使用fcntl的F_SETOWN命令设置。  3,开启该套接口的信号驱动 阅读详情
#include "unp.h"
#include <signal.h>
/*server */
#define QSIZE 10

struct  DG{
	void *data;
	size_t datalen;
	struct sockaddr_in addr;
	socklen_t addrlen;
};

struct DG client[QSIZE];		/*循环队列*/
int nqueue, nin, nout, sockfd;
void mydg_echo(int fd, SA * addr, socklen_t len);
void recvdata(int signo);

int main(int argc, char **argv){
	struct sockaddr_in serv, cli;
	if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
		err_sys("socket");
	bzero(&serv, sizeof(serv));
	serv.sin_family = AF_INET;
	serv.sin_port = htons(SERV_PORT);
	serv.sin_addr.s_addr = htonl(INADDR_ANY);
	bind(sockfd, (SA *)&serv, sizeof(serv));
	mydg_echo(sockfd, (SA *)&cli, sizeof(cli));
	close(sockfd);
	exit(0);
}

void mydg_echo(int fd, SA *  addr, socklen_t len){
	const int on =1;
	sigset_t zeroset, oldset, newset;
	int i, flags;
	nqueue = nin = nout = 0;
	for(i =0; i < QSIZE; i++){
		client[i].data =(char *)malloc(MAXLINE);
		client[i].addrlen = sizeof(struct sockaddr_in);
	}
	printf("t1\n");
	signal(SIGIO, recvdata);
	fcntl(fd, F_SETOWN, getpid());
	/*
		ioctl(fd, FIOASYNC, &on);
		ioctl(fd, FIONBIO, &on);
	*/
	if((flags = fcntl(fd, F_GETFL,0)) < 0)
		err_sys("fcntl1");
	flags |= O_NONBLOCK;
	flags |= O_ASYNC;
	if(fcntl(fd, F_SETFL, flags) < 0)
		err_sys("fcntl2");
	sigemptyset(&zeroset);
	sigemptyset(&oldset);
	sigemptyset(&newset);
	sigaddset(&newset, SIGIO);
	sigprocmask(SIG_BLOCK, &newset,&oldset);
	for( ; ; ){
		while(nqueue == 0){
			sigsuspend(&zeroset);
		}
		/*the SIGIO happen*/
		sigprocmask(SIG_UNBLOCK, &newset, NULL);
		sendto(fd, client[nout].data, client[nout].datalen, 0,
			(SA *)&client[nout].addr, client[nout].addrlen);
		nout++;
		nqueue --;
		if(nout >= QSIZE)
			nout = 0;
		sigprocmask(SIG_BLOCK, &newset, NULL);
	}
	sigprocmask(SIG_SETMASK, &oldset, NULL);
	return;
}

void recvdata(int signo){/*auto block SIGIO*/
	/*		printf("recvfrom \n");*/
	int n, len;
	struct sockaddr_in tmpaddr;
	char buf[MAXLINE];
	while((n = recvfrom(sockfd,client[nin].data ,  MAXLINE, 0, (SA *)&client[nin].addr, &client[nin].addrlen)) > 0){

		client[nin].datalen = n;
		//client[nin].addr = tmpaddr;
		//client[nin].data = buf;
		//client[nin].addrlen = len;
		nin++;
		nqueue ++;
		if(nin >= QSIZE)
			nin = 0;
	}
	return;
}



APK静态分析(取证角度)——理论部分 APP是指应用程序(Application),是指能够在手机、平板电脑、电脑等移动设备上运行的软件。APP可以帮助用户进行各种功能操作,如社交媒体、游戏、购物、学习、工作等。用户可以通过应用商店或者在线下载安装APP,然后在设备上使用它们。APP的种类非常丰富,能够满足用户不同的需求和兴趣。 阅读详情

相关推荐

工程制图习题集张大庆课后习题答案解析

所以,我想向大家求助,希望能得到一些学习资料、学习方法和学习经验,帮助我更好地理解和掌握这门课程。在寻找学习资料的过程中,我发现了一款叫做资小料的APP,它里面有很多关于工程制图的学习资料,包括视频教程、习题解答和考试真题等。通过使用资小料,我逐渐掌握了工程制图的基本理论和方法,解决了很多学习中遇到的问题。在这里,我想推荐给和我一样在学习《工程制图习题集》这门课的同学们,希望大家也能从这款APP中受益,共同进步。上传者: 『Consentesdei』蒼迷穀。出版社: 清华大学出版社。

weixin_58833001的博客 925

Linux的信号机制与异步通知机制

1.GPIO异步通知机制 //应用程序需要完成如下三个步骤: (1)signal(SIGIO, sig_handler); 调用signal函数,让指定的信号SIGIO与处理函数sig_handler对应。 (2)fcntl(fd, F_SET_OWNER, getpid()); 指定一个进程作为文件的“属主(filp->owner)”,这样内核才知道信号要发给哪个进程。 (3...

u011942916的专栏 606

保姆级教程:用Verilog手把手实现一个MIPI CSI-2 D-PHY接收器(附PPI接口时序详解)

本文提供了一份详细的Verilog实现MIPI CSI-2 D-PHY接收器的教程,重点解析了PPI接口时序和deskew数据对齐技术。通过模块划分、时钟域处理、状态机设计和错误恢复机制等实战内容,帮助开发者掌握高速数据接收的核心技术,适用于嵌入式视觉系统开发。

weixin_30619101的博客 513

Linux非阻塞IO(八)使用epoll重新实现非阻塞的回射服务器

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33919941的博客 190

SOLIDWORKS转CAD字体终极选择:TrueType vs SHX,哪个才是你图纸协作的“安全牌”?

本文深入探讨SOLIDWORKS转CAD工程图中的字体选择问题,对比TrueType与SHX字体在DWG文件协作中的表现。通过真实案例揭示字体映射的兼容性陷阱,提供企业级字体管理方案,帮助工程师规避版本差异、系统依赖和法律风险,确保图纸协作的稳定性。

weixin_34233974的博客 265

部署Doris

本文详细介绍了Apache Doris三节点集群(3 FE + 3 BE)的部署流程。首先从硬件配置、系统参数调优等准备工作入手,然后分步说明FE和BE节点的配置方法,包括端口设置、存储路径规划等关键参数。部署完成后提供SQL测试用例和数据一致性验证方法,并总结常见问题解决方案,如节点加入失败、磁盘容量异常等。文档包含完整的命令和配置示例,强调高可用配置和监控建议,为生产环境部署提供实用指导。

神棍之路 1713

linux信号驱动i o,信号驱动I/O实例

4,信号驱动I/O :让内核在描述字就绪时发送SIGIO信号通知我们。首先开启套接口的信号驱动1/O功能,sigaction系统调用安装一个信号处理函数,当内核数据包准备好时,会为该进程产生一个SIGIO信号。应用可以在信号处理时接收数据。具体步骤:1,建立SIGIO信号处理函数。2,设置该套接口的属主,通常使用fcntl的F_SETOWN命令设置。3,开启该套接口的信号驱动I/O,通常使用fcn...

weixin_39870132的博客 349

Ubuntu 22.04 LTS升级OpenSSH 9.6p1完整指南(附OpenSSL 3.2.0适配方案)

本文详细介绍了在Ubuntu 22.04 LTS系统中升级OpenSSH至9.6p1版本的全流程,包括OpenSSL 3.2.0的适配方案。从准备工作、依赖库安装、源代码编译到系统集成与配置,提供了完整的操作指南和常见问题解决方法,帮助用户安全高效地完成升级,提升服务器安全性和性能。

i8j9k0l1的博客 318

服务器编程入门(11)TCP并发回射服务器实现 - 单线程select实现

问题聚焦: 当客户端阻塞于从标准输入接收数据时,将读取不到别的途径发过来的必要信息,如TCP发过来的FIN标志。 因此,进程需要内核一旦发现进程指定的一个或多个IO条件就绪(即输入已准备好被读取,或者描述符已能承接更多的输出),它就通知进程。 这个机制称为I/O复用,这是由select, poll, epoll函数支持的。 编译环境:     Ubuntu12.0

面团的专栏 2145

首个FDA认证开源医学影像AI平台Comp2Comp:从CT自动分析到临床部署全解析

深度学习模型在医学影像分析领域正成为变革性力量,其核心原理是通过卷积神经网络自动学习图像特征,实现精准分割与检测。这一技术价值在于将高度依赖医生经验的定性、主观判断,转化为高效、客观、可重复的定量分析,极大提升了诊断的一致性和工作效率。在应用场景上,医学影像AI已广泛渗透于疾病筛查、辅助诊断、预后评估及治疗方案规划等多个环节。本文聚焦于获得FDA 510(k)认证的开源平台Comp2Comp,它集成了主动脉钙化评分和椎体骨密度分析双任务,通过串联式的U-Net分割网络与目标检测模型,构建了从DICOM预处理

weixin_33725126的博客 653

从零搭建一个AF架构项目:基于TIA Portal V19和S7-PLCSIM的仿真调试全流程

本文详细介绍了如何在TIA Portal V19环境中从零搭建西门子Automation Framework(AF架构)项目,包括环境准备、硬件组态、核心组件创建、项目架构分层实现以及仿真调试全流程。通过模块化编程和标准化接口设计,AF架构显著提升工业自动化项目的开发效率和维护便利性,特别适合S7-1500系列PLC的应用开发。

weixin_29313547的博客 673

UNP读书笔记 第六章 select和poll

先讲了五种IO模型阻塞式IO:      readcv系统调用-&gt;阻塞-&gt;等待系统调用返回非阻塞式IO    系统调用-&gt;无数据-&gt;不阻塞,直接返回-&gt;继续调用直到返回成功这样很浪费CPUIO复用模型    调用select-&gt;阻塞-&gt;等某个数据准备好-&gt;再调用readcv系统调用信号驱动IO模型    调用Signal,等捕捉某个信号时,才调用re...

DrawnBreak 371

PyCharm 接入 OpenAI Codex CLI 的 4 步配置与调试实录

揭示 Codex CLI 在 PyCharm 中上下文失稳的四大根源:CLI 启动模式与 IDE 进程模型冲突、stdin/stdout 流式处理不兼容、环境变量污染、AST 注释缺失,并给出基于 Shell 脚本桥接与结构化上下文注入的稳定接入方案。

weixin_42627902的博客 372

一个标准的回射服务器搭建:select 和 poll 函数

直到客户端检测不到EOF。这个时候需要进程有一种能力。 这个能力:发现一旦一个多个I/O通道(网络,操作系统)就绪。它就会通知进程。 这个能力就是I/O复用! 一般由select 和 poll 这两个函数支持。还有一个函数pselect。 有几个场景需要应用到这个能力: 1 当客户处理 多个描述符。(处理交互输入 和 网络套接字) (不同描述符) 2 一个客户处理多个 网...

weixin_30778805的博客 57

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

非阻塞网络编程详解------IO模型

1、前言 随着互联网的发展,面对海量用户高并发业务,传统的阻塞式的服务端架构模式已经无能为力。本文(和下篇《高性能网络编程(六):一文读懂高性能网络编程中的线程模型》)旨在为大家提供有用的高性能网络编程的I/O模型概览以及网络服务进程模型的比较,以揭开设计和实现高性能网络架构的神秘面纱。限于篇幅原因,请将本文与《高性能网络编程(六):一文读懂高性能网络编程中的线程模型》连起来读,这样会让知识更连...

Caesar Home 591

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Unix网络编程(六)高级I/O技术之复用技术 select

本文将讨论网络编程中的高级I/O复用技术,将从下面几个方面进行展开: a. 什么是复用技术呢? b. 什么情况下需要使用复用技术呢? c. I/O的复用技术的工作原理是什么? d. select, poll and epoll的实现机制,以及他们之间的区别。

挑灯看剑的专栏 2095

UNIX网络编程——I/O复用(select、poll)

1、五种I/O模型:      (1)阻塞式I/O;(2)非阻塞式I/O;(3)I/O复用(select、poll);(4)信号驱动式I/O(SIGIO);(5)异步I/O(aio_系列函数);       一个输入操作分为两个阶段:A. 等待数据准备好;B. 从内核向进程复制数据。       一个套接字上的输入也类似,A. 等待数据从网络中到达(所等待分组到达时,会被复制到内核中的某个缓

松狮 1157

腾讯2016年实习校招——后台开发岗位

前言: 腾讯的笔试感觉做的一般,4题里做对了两题,并且一道简单的MySQL语句也写错了。没想到还是收到了面试通知, 我的github: 寒假刷了150题的leetcode,现在也放在了我的github里,不仅仅有每一题的解题代码,还记录了我解题的时候的思路,以及遇上的问题。是一个很好的总结,欢迎大家前去参观。 https://github.com/YinWenAtB

yw8355507的专栏 1499

UDP 超时重传机制

问题来源: 老式方法:UDP传输设定超时未N秒,发送一个请求后等待N秒钟,若超时都没有收到确认,则重发请求,重发一定次数后便丢弃。 老式方法不合理的原因:由于网络上影响因素的不同,可能RTT差别较大,设定一个固定的超时时间使资源不能得到合理应用。 较好的方法:根据实测的RTT及其他因素考虑在内来估计超时时间。 术语 RTO:重传超时 Srtt:平滑化的RTT估算因子 Reevar:平滑化平均偏差估

多线程fork多进程 1万+

双向链表实现线程池 用于TCP并发连接

简述:自我感觉对C指针了解的还是比较透彻,能够运用自如,一方面练习一下多线程编程,另一方面练习一下数据结构链表。 但是完成的过程中,各种问题还是扑面而来,共花了2个小时完成了此线程池来实现TCP并发连接,创建固定数目的线程 时间仓促,可能有某些指针未释放,或者还没完善的地方,希望能共同讨论。 双向链表提高扫描速度,信号等待用while保护,防止惊群,在任务提取和加入过程动态维护链表,防止链表

多线程fork多进程 1686

fedora9下使用QT连接数据库(QSqlDatabase: QODBC driver not loaded)

开源版的QT没有提供Mysql的驱动,导致使用数据库的时候提示如下错误: QSqlDatabase: QODBC driver not loaded QSqlDatabase: available drivers: QSQLITE 解决方法:重新编译QT  ./configure -qt-sql-mysql -qt-sql-sqlite -plugin-sql-mysql -plugi

多线程fork多进程 1562

简单进程池实现多TCP客户服务

根据预定义进程数创建进程池。 父子进程通信使用的IPC方式为:UNIX域套接字 父进程listen,aeecpt,并将连接套接字发送到子进程,交由子进程处理该连接。 子进程处理完毕,与父进程通信,实现资源回收,并在下一连接到来交由该完毕的子进程。 #include "unp.h" #include #define IDLE 0 #define BUSY 1 #define END

多线程fork多进程 1484

源路径选项

1. V4,V6头部差异 IP源路径选项: 对于IPV4,由于IP头部长度字段为4位,最大可以表示15,那么限制了IPV4的头部总长度为15*4 = 60字节。前10字节为固定的头部部分,所以最多有40个字节用来填充选项字段。 对于IPV6,固定长度的40字节的IPV6头部和传输层头部之间可以有扩展头部。 2. V4,6头部选项字段填充和获取使用setsockopt和getsockopt,传入参数

多线程fork多进程 1280

基于线程池实现linux下守护进程运行web目录服务器

LInux先建立线程池,主函数监听套机字,accept后,将连接套接字投入线程池处理。 自己搞的这个线程池,暂时没有发现问题,运行效果还行。 虽然free是线程安全,不可重入的。但是我们并没使用静态变量,所以不会存在问题 下为main函数,运行参数为  ./web  n  k     ;n为想线程池初始化的线程数,k为0为终端运行,k为1则转为守护进程。 运行如图 支持文

多线程fork多进程 1177

校验和总结

1:IP校验和只校验20字节的IP报头,并不会计算数据部分的校验和。因为IP也是不可靠,尽最大努力投递。 2:ICMP校验和覆盖整个报文(ICMP报头+ICMP数据); 3:UDP和TCP校验和不仅覆盖整个报文(头部+数据),而且还有12字节的IP伪首部,其中包括源IP地址(4字节)、目的IP地址(4字节)、协议(2字节,第一字节补0)和TCP/UDP包长(2字节)。另外UDP、TCP数据报的

多线程fork多进程 736

原始套接口基础知识

原始套接口输出:        1如果已经连接,则可以使用write,writev,send        2.未连接,则使用sendto,sendmsg        3.开启IP_HDRINCL:进程需要自填充IP,进程调用输出函数时的字节数包括IP头部。               IPV4的标识字段可以设置成0,由内核填充该值;               IPV4的头部校验和字

多线程fork多进程 703

利用Unix域套接字实现IPC

写完后,至少调试了30分钟时间。 错误1: snprintf(argsockfd, sizeof(argsockfd), "%d", sockfd[1]); snprintf(argmode, sizeof(argmode), "%d", mode); 写作: snprintf(argsockfd, sizeof(argsockfd), "%s", sockfd[1]); snprintf(arg

多线程fork多进程 697
上一篇: 利用Unix域套接字实现IPC
下一篇: 寻找第K小元素O(N)算法
七绝乌梭
博客等级 码龄18年 5粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值