#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;
}
相关推荐
工程制图习题集张大庆课后习题答案解析
所以,我想向大家求助,希望能得到一些学习资料、学习方法和学习经验,帮助我更好地理解和掌握这门课程。在寻找学习资料的过程中,我发现了一款叫做资小料的APP,它里面有很多关于工程制图的学习资料,包括视频教程、习题解答和考试真题等。通过使用资小料,我逐渐掌握了工程制图的基本理论和方法,解决了很多学习中遇到的问题。在这里,我想推荐给和我一样在学习《工程制图习题集》这门课的同学们,希望大家也能从这款APP中受益,共同进步。上传者: 『Consentesdei』蒼迷穀。出版社: 清华大学出版社。
Linux的信号机制与异步通知机制
1.GPIO异步通知机制 //应用程序需要完成如下三个步骤: (1)signal(SIGIO, sig_handler); 调用signal函数,让指定的信号SIGIO与处理函数sig_handler对应。 (2)fcntl(fd, F_SET_OWNER, getpid()); 指定一个进程作为文件的“属主(filp->owner)”,这样内核才知道信号要发给哪个进程。 (3...
保姆级教程:用Verilog手把手实现一个MIPI CSI-2 D-PHY接收器(附PPI接口时序详解)
本文提供了一份详细的Verilog实现MIPI CSI-2 D-PHY接收器的教程,重点解析了PPI接口时序和deskew数据对齐技术。通过模块划分、时钟域处理、状态机设计和错误恢复机制等实战内容,帮助开发者掌握高速数据接收的核心技术,适用于嵌入式视觉系统开发。
Linux非阻塞IO(八)使用epoll重新实现非阻塞的回射服务器
2019独角兽企业重金招聘Python工程师标准>>> ...
SOLIDWORKS转CAD字体终极选择:TrueType vs SHX,哪个才是你图纸协作的“安全牌”?
本文深入探讨SOLIDWORKS转CAD工程图中的字体选择问题,对比TrueType与SHX字体在DWG文件协作中的表现。通过真实案例揭示字体映射的兼容性陷阱,提供企业级字体管理方案,帮助工程师规避版本差异、系统依赖和法律风险,确保图纸协作的稳定性。
部署Doris
本文详细介绍了Apache Doris三节点集群(3 FE + 3 BE)的部署流程。首先从硬件配置、系统参数调优等准备工作入手,然后分步说明FE和BE节点的配置方法,包括端口设置、存储路径规划等关键参数。部署完成后提供SQL测试用例和数据一致性验证方法,并总结常见问题解决方案,如节点加入失败、磁盘容量异常等。文档包含完整的命令和配置示例,强调高可用配置和监控建议,为生产环境部署提供实用指导。
linux信号驱动i o,信号驱动I/O实例
4,信号驱动I/O :让内核在描述字就绪时发送SIGIO信号通知我们。首先开启套接口的信号驱动1/O功能,sigaction系统调用安装一个信号处理函数,当内核数据包准备好时,会为该进程产生一个SIGIO信号。应用可以在信号处理时接收数据。具体步骤:1,建立SIGIO信号处理函数。2,设置该套接口的属主,通常使用fcntl的F_SETOWN命令设置。3,开启该套接口的信号驱动I/O,通常使用fcn...
Ubuntu 22.04 LTS升级OpenSSH 9.6p1完整指南(附OpenSSL 3.2.0适配方案)
本文详细介绍了在Ubuntu 22.04 LTS系统中升级OpenSSH至9.6p1版本的全流程,包括OpenSSL 3.2.0的适配方案。从准备工作、依赖库安装、源代码编译到系统集成与配置,提供了完整的操作指南和常见问题解决方法,帮助用户安全高效地完成升级,提升服务器安全性和性能。
服务器编程入门(11)TCP并发回射服务器实现 - 单线程select实现
问题聚焦: 当客户端阻塞于从标准输入接收数据时,将读取不到别的途径发过来的必要信息,如TCP发过来的FIN标志。 因此,进程需要内核一旦发现进程指定的一个或多个IO条件就绪(即输入已准备好被读取,或者描述符已能承接更多的输出),它就通知进程。 这个机制称为I/O复用,这是由select, poll, epoll函数支持的。 编译环境: Ubuntu12.0
首个FDA认证开源医学影像AI平台Comp2Comp:从CT自动分析到临床部署全解析
深度学习模型在医学影像分析领域正成为变革性力量,其核心原理是通过卷积神经网络自动学习图像特征,实现精准分割与检测。这一技术价值在于将高度依赖医生经验的定性、主观判断,转化为高效、客观、可重复的定量分析,极大提升了诊断的一致性和工作效率。在应用场景上,医学影像AI已广泛渗透于疾病筛查、辅助诊断、预后评估及治疗方案规划等多个环节。本文聚焦于获得FDA 510(k)认证的开源平台Comp2Comp,它集成了主动脉钙化评分和椎体骨密度分析双任务,通过串联式的U-Net分割网络与目标检测模型,构建了从DICOM预处理
从零搭建一个AF架构项目:基于TIA Portal V19和S7-PLCSIM的仿真调试全流程
本文详细介绍了如何在TIA Portal V19环境中从零搭建西门子Automation Framework(AF架构)项目,包括环境准备、硬件组态、核心组件创建、项目架构分层实现以及仿真调试全流程。通过模块化编程和标准化接口设计,AF架构显著提升工业自动化项目的开发效率和维护便利性,特别适合S7-1500系列PLC的应用开发。
UNP读书笔记 第六章 select和poll
先讲了五种IO模型阻塞式IO: readcv系统调用->阻塞->等待系统调用返回非阻塞式IO 系统调用->无数据->不阻塞,直接返回->继续调用直到返回成功这样很浪费CPUIO复用模型 调用select->阻塞->等某个数据准备好->再调用readcv系统调用信号驱动IO模型 调用Signal,等捕捉某个信号时,才调用re...
PyCharm 接入 OpenAI Codex CLI 的 4 步配置与调试实录
揭示 Codex CLI 在 PyCharm 中上下文失稳的四大根源:CLI 启动模式与 IDE 进程模型冲突、stdin/stdout 流式处理不兼容、环境变量污染、AST 注释缺失,并给出基于 Shell 脚本桥接与结构化上下文注入的稳定接入方案。
一个标准的回射服务器搭建:select 和 poll 函数
直到客户端检测不到EOF。这个时候需要进程有一种能力。 这个能力:发现一旦一个多个I/O通道(网络,操作系统)就绪。它就会通知进程。 这个能力就是I/O复用! 一般由select 和 poll 这两个函数支持。还有一个函数pselect。 有几个场景需要应用到这个能力: 1 当客户处理 多个描述符。(处理交互输入 和 网络套接字) (不同描述符) 2 一个客户处理多个 网...
假人有限元模型
假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用
C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片
基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正
非阻塞网络编程详解------IO模型
1、前言 随着互联网的发展,面对海量用户高并发业务,传统的阻塞式的服务端架构模式已经无能为力。本文(和下篇《高性能网络编程(六):一文读懂高性能网络编程中的线程模型》)旨在为大家提供有用的高性能网络编程的I/O模型概览以及网络服务进程模型的比较,以揭开设计和实现高性能网络架构的神秘面纱。限于篇幅原因,请将本文与《高性能网络编程(六):一文读懂高性能网络编程中的线程模型》连起来读,这样会让知识更连...
OV9734 DATASHEET,完整规格书
OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等
Unix网络编程(六)高级I/O技术之复用技术 select
本文将讨论网络编程中的高级I/O复用技术,将从下面几个方面进行展开: a. 什么是复用技术呢? b. 什么情况下需要使用复用技术呢? c. I/O的复用技术的工作原理是什么? d. select, poll and epoll的实现机制,以及他们之间的区别。
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. 等待数据从网络中到达(所等待分组到达时,会被复制到内核中的某个缓
腾讯2016年实习校招——后台开发岗位
前言: 腾讯的笔试感觉做的一般,4题里做对了两题,并且一道简单的MySQL语句也写错了。没想到还是收到了面试通知, 我的github: 寒假刷了150题的leetcode,现在也放在了我的github里,不仅仅有每一题的解题代码,还记录了我解题的时候的思路,以及遇上的问题。是一个很好的总结,欢迎大家前去参观。 https://github.com/YinWenAtB
UDP 超时重传机制
问题来源: 老式方法:UDP传输设定超时未N秒,发送一个请求后等待N秒钟,若超时都没有收到确认,则重发请求,重发一定次数后便丢弃。 老式方法不合理的原因:由于网络上影响因素的不同,可能RTT差别较大,设定一个固定的超时时间使资源不能得到合理应用。 较好的方法:根据实测的RTT及其他因素考虑在内来估计超时时间。 术语 RTO:重传超时 Srtt:平滑化的RTT估算因子 Reevar:平滑化平均偏差估
双向链表实现线程池 用于TCP并发连接
简述:自我感觉对C指针了解的还是比较透彻,能够运用自如,一方面练习一下多线程编程,另一方面练习一下数据结构链表。 但是完成的过程中,各种问题还是扑面而来,共花了2个小时完成了此线程池来实现TCP并发连接,创建固定数目的线程 时间仓促,可能有某些指针未释放,或者还没完善的地方,希望能共同讨论。 双向链表提高扫描速度,信号等待用while保护,防止惊群,在任务提取和加入过程动态维护链表,防止链表
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
简单进程池实现多TCP客户服务
根据预定义进程数创建进程池。 父子进程通信使用的IPC方式为:UNIX域套接字 父进程listen,aeecpt,并将连接套接字发送到子进程,交由子进程处理该连接。 子进程处理完毕,与父进程通信,实现资源回收,并在下一连接到来交由该完毕的子进程。 #include "unp.h" #include #define IDLE 0 #define BUSY 1 #define END
源路径选项
1. V4,V6头部差异 IP源路径选项: 对于IPV4,由于IP头部长度字段为4位,最大可以表示15,那么限制了IPV4的头部总长度为15*4 = 60字节。前10字节为固定的头部部分,所以最多有40个字节用来填充选项字段。 对于IPV6,固定长度的40字节的IPV6头部和传输层头部之间可以有扩展头部。 2. V4,6头部选项字段填充和获取使用setsockopt和getsockopt,传入参数
基于线程池实现linux下守护进程运行web目录服务器
LInux先建立线程池,主函数监听套机字,accept后,将连接套接字投入线程池处理。 自己搞的这个线程池,暂时没有发现问题,运行效果还行。 虽然free是线程安全,不可重入的。但是我们并没使用静态变量,所以不会存在问题 下为main函数,运行参数为 ./web n k ;n为想线程池初始化的线程数,k为0为终端运行,k为1则转为守护进程。 运行如图 支持文
校验和总结
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数据报的
原始套接口基础知识
原始套接口输出: 1如果已经连接,则可以使用write,writev,send 2.未连接,则使用sendto,sendmsg 3.开启IP_HDRINCL:进程需要自填充IP,进程调用输出函数时的字节数包括IP头部。 IPV4的标识字段可以设置成0,由内核填充该值; IPV4的头部校验和字
利用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
925



被折叠的 条评论
为什么被折叠?



