主流I/O模型总结

异步通知I/O模型(Windows)

#include<string.h>
#include<stdio.h>
#include<WinSock2.h>
#define BUF_SIZE 100
void CompressSockets(SOCKET hSockArr[], int idx, int total);
void CompressEvent(WSAEVENT hEventArr[], int idx, int total);
char msg[BUF_SIZE];//缓冲区
int main(int argc,char* argv[])
{WSADATA wsaData;//初始化网络if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){printf("WSAStartup error!\n");return -1;}SOCKET hServSock, hClentSock;//服务器客户端套接字SOCKADDR_IN servAdr, clntAdr;//服务器客户端地址SOCKET hSockArr[WSA_MAXIMUM_WAIT_EVENTS];//套接字数组WSAEVENT hEventArr[WSA_MAXIMUM_WAIT_EVENTS];//句柄数组int numOfClntSock = 0;//套接字数量WSAEVENT newEvent;//事件对象//初始化服务器套接字hServSock = socket(PF_INET, SOCK_STREAM, 0);memset(&servAdr, 0, sizeof(servAdr));servAdr.sin_family = AF_INET;servAdr.sin_addr.s_addr = htonl(INADDR_ANY);servAdr.sin_port = ntohs(atoi(argv[1]));if (bind(hServSock, (SOCKADDR*)&servAdr, sizeof(servAdr)) == SOCKET_ERROR){printf("bind error!\n");return -2;}if (listen(hServSock, 5) == SOCKET_ERROR){printf("listen error!\n");return -3;}newEvent = WSACreateEvent();//创建一个事件对象if (WSAEventSelect(hServSock, newEvent, FD_ACCEPT) == SOCKET_ERROR)//连接事件对象的套接字 套接字发生FD_ACCEPT事件,newEvent内核对象改变为signaled状态{printf("listen error!\n");return -4;}hSockArr[numOfClntSock] = hServSock;//加入套接字hEventArr[numOfClntSock] = newEvent;//加入句柄numOfClntSock++;//开始监听事件while (1){int posInfo, StartIdx;//StartIdx = posInfo-WSA_WAIT_EVENT_0; 转变为signaled状态的事件对象最小句柄索引posInfo = WSAWaitForMultipleEvents(numOfClntSock, hEventArr, FALSE, WSA_INFINITE, FALSE);//等待一个事件发生StartIdx = posInfo - WSA_WAIT_EVENT_0; //转变为signaled状态的事件对象的最小句柄的索引for (int i = StartIdx; i < numOfClntSock; i++){int sigEventIdx = WSAWaitForMultipleEvents(1, &hEventArr[i], TRUE, 0, FALSE);//遍历其他每个事件对象(非阻塞)if (sigEventIdx == WSA_WAIT_FAILED || sigEventIdx == WSA_WAIT_TIMEOUT)//i对应内核对象没有发生事件{continue;}else//i内核对象发生了事件{WSANETWORKEVENTS netEvents;//保存事件类型和错误信息sigEventIdx = i;WSAEnumNetworkEvents(hSockArr[sigEventIdx], hEventArr[sigEventIdx], &netEvents);//区分事件类型if (netEvents.lNetworkEvents & FD_ACCEPT)//连接事件{if (netEvents.iErrorCode[FD_ACCEPT_BIT])//错误{printf("Accept Error!\n");return -5;}int clntAdrLen = sizeof(clntAdr);//客户端地址长度hClentSock = accept(hSockArr[sigEventIdx], (SOCKADDR*)&clntAdr, &clntAdrLen);//接收连接newEvent = WSACreateEvent();//创建新内核事件对象WSAEventSelect(hClentSock, newEvent, FD_READ | FD_CLOSE);//连接事件对象的套接hEventArr[numOfClntSock] = newEvent;hSockArr[numOfClntSock] = hClentSock;numOfClntSock++;printf("connected new client...");}if (netEvents.lNetworkEvents & FD_READ)//通信事件{if (netEvents.iErrorCode[FD_READ_BIT] != 0){printf("read error");return -6;}int strLen = recv(hSockArr[sigEventIdx], msg, sizeof(msg), 0);send(hSockArr[sigEventIdx], msg, strLen, 0);}if (netEvents.lNetworkEvents & FD_CLOSE)//断开连接事件{if (netEvents.iErrorCode[FD_CLOSE_BIT] != 0){printf("Close Error");break;}//关闭套接字和事件对象WSACloseEvent(hEventArr[sigEventIdx]);closesocket(hSockArr[sigEventIdx]);//调整套接字数组和事件数组平衡numOfClntSock--;CompressEvent(hEventArr, sigEventIdx, numOfClntSock);CompressSockets(hSockArr, sigEventIdx, numOfClntSock);}}}}WSACleanup();return 0;
}void CompressSockets(SOCKET hSockArr[], int idx, int total)
{for (int i=idx; i < total; i++){hSockArr[i] = hSockArr[i + 1];}
}
void CompressEvent(WSAEVENT hEventArr[], int idx, int total)
{for (int i=idx; i < total; i++){hEventArr[i] = hEventArr[i + 1];}
}

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

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

相关文章

奇景光电战略投资Obsidian,共筑热成像技术新未来

5月29日,业界领先的IC设计公司奇景光电宣布,将对热成像传感器解决方案制造商Obsidian进行战略性投资,并以主要投资者的身份,参与到Obsidian的可转换票据融资活动中。虽然奇景光电并未公开具体的投资金额,但这一举动无疑向市场传递了一个明确的信号:奇景光电对Obsidian的技…

【INTEL(ALTERA)】为什么我会看到包含管道桥的Nios II设计出现 Flash Programmer 问题?

目录 说明 解决方法 说明 简化地址解码的常见解决方案是将连接到Avalon管道桥后Nios II处理器的数据主的外设放置&#xff0c;有时可能包括一些内存 IP&#xff0c;如片上 RAM。 但是&#xff0c;如果预期内存包含Nios II程序代码&#xff0c;则应该以与Nios II指令主连接到…

10、matlab中字符、数字、矩阵、字符串和元胞合并为字符串并将字符串以不同格式写入读出excel

1、前言 在 MATLAB 中&#xff0c;可以使用不同的数据类型&#xff08;字符、数字、矩阵、字符串和元胞&#xff09;合并为字符串&#xff0c;然后将字符串以不同格式写入 Excel 文件。 以下是一个示例代码&#xff0c;展示如何将不同数据类型合并为字符串&#xff0c;并以不…

【Mindspore进阶】-03.ShuffleNet实战

ShuffleNet图像分类 当前案例不支持在GPU设备上静态图模式运行&#xff0c;其他模式运行皆支持。 ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;所以模型的设计目标就是利用有…

如何在Java中实现自动化测试和集成测试

如何在Java中实现自动化测试和集成测试 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 自动化测试和集成测试是现代软件开发过程中至关重要的环节。Java作为一…

分享实现地铁车辆侧面图

简介 通过伪类和关键帧动画实现地铁车辆侧面图 在线演示 伪元素和关键帧动画 实现代码 <!DOCTYPE html><html><head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <meta http-equiv"X-UA-Co…

设计模式之单例模式(Java)

单例模式实现方式&#xff1a;懒汉式、饿汉式、双重检查、枚举、静态内部类&#xff1b; 懒汉式&#xff1a; /*** 懒汉式单例模式* author: 小手WA凉* create: 2024-07-06*/ public class LazySingleton implements Serializable {private static LazySingleton lazySinglet…

对BSV区块链的曼达拉网络通俗易懂的解释

​​发表时间&#xff1a;2023年6月15日 BSV区块链正在引入“曼达拉”升级&#xff0c;使BSV区块链网络的拓扑结构能够适配Teranode&#xff0c;适配这个可以大幅扩容的节点软件。BSV区块链上曼达拉网络的概念并不会改变整个系统的核心规则&#xff1b;相反&#xff0c;它能够引…

为什么https比http更安全

读完本文&#xff0c;希望你能明白&#xff1a; HTTP通信存在什么问题HTTPS如何改进HTTP存在那些问题HTTPS工作原理是什么 一、什么是HTTPS HTTPS是在HTTP上建立SSL加密层&#xff0c;并对传输数据进行加密&#xff0c;是HTTP协议的安全版。现在它被广泛用于万维网上安全敏感…

【qt】如何获取本机的IP地址?

需要用到这个类QHostInfo和pro里面添加network模块 用这个类的静态函数forName()来获取该主机名的信息 返回的就是这个类 这个QHostInfo类就包括主机的IP地址信息 用静态函数addresses()来获取 返回的是一个QHostAddress的容器 QList<QHostAddress>addrList hostIn…

Laravel队列机制深度解析:异步任务处理的高效之道

Laravel队列机制深度解析&#xff1a;异步任务处理的高效之道 Laravel的队列系统是一个强大的工具&#xff0c;用于执行后台任务和异步处理。它允许开发者将耗时的任务&#xff0c;如发送邮件、处理图片等&#xff0c;放入队列中&#xff0c;然后由后台工作进程异步执行。本文…

Docker 镜像移动或复制到另一台服务器

在实际的开发和部署过程中&#xff0c;我们可能需要将 Docker 镜像从一台服务器移动或复制到另一台服务器。本文将详细介绍如何实现这一操作&#xff0c;帮助你更好地管理和迁移 Docker 镜像。 一、使用 docker save 和 docker load 命令 docker save 和 docker load 是 Dock…

课题申报书中要用的思路图(技术路线图)30张,超高清!

最近在弄课题申报书的时候&#xff0c;需要画“技术路线图”&#xff1b;和小伙伴们探讨才发现很多人居然不会画这种图&#xff0c;还有很多人在Word里面一点一点拼凑…… 我给大家收集了网上非常热门的30张“技术路线图”&#xff0c;但网上流传的都太模糊了&#xff0c;想看…

KBPC3506-ASEMI储能专用整流桥KBPC3506

编辑&#xff1a;ll KBPC3506-ASEMI储能专用整流桥KBPC3506 型号&#xff1a;KBPC3506 品牌&#xff1a;ASEMI 封装&#xff1a;KBPC-4 正向电流&#xff08;Id&#xff09;&#xff1a;35A 反向耐压&#xff08;VRRM&#xff09;&#xff1a;600V 正向浪涌电流&#xf…

基于RK3588的8路摄像头实时全景拼接

基于RK3588的8路摄像头实时全景拼接 输入&#xff1a;2路csi转8路mpi的ahd摄像头&#xff0c;分辨率1920 * 1080 8路拼接结果&#xff1a; 6路拼接结果&#xff1a; UI界面&#xff1a; UI节目设计原理

SpringBoot新手快速入门系列教程一:window上编程环境安装和配置

首先编译器&#xff0c;建议各位不要去尝试AndroidStudio和VisualStudio来做SpringBoot项目。乖乖的直接下载最新版即可 https://www.jetbrains.com.cn/idea/ 当然这是一个收费的IDE&#xff0c;想要便宜可以想办法去某宝买授权&#xff0c;仅供学习参考用&#xff01;赚了钱…

Spring Boot中的多租户架构实现

Spring Boot中的多租户架构实现 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 一、引言 随着云计算和SaaS&#xff08;软件即服务&#xff09;模式的流行&a…

Matlab中collectPlaneWave函数的应用

查看文档如下&#xff1a; 可以看出最多5个参数&#xff0c;分别是阵列对象&#xff0c;信号幅度&#xff0c;入射角度&#xff0c;信号频率&#xff0c;光速。 在下面的代码中&#xff0c;我们先创建一个3阵元的阵列&#xff0c;位置为&#xff1a;&#xff08;-1,0,0&#x…

52-3 权限维持 - IFEO注入(镜像劫持)

IFEO注入(映像劫持)介绍 IFEO(Image File Execution Options)位于Windows注册表中的路径为: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options IFEO最初设计用于为在默认系统环境下可能出现错误的程序提供特殊的调试和执…

MySQL 常见错误及解决方案

1. Too many connections 运行环境&#xff1a;Winows11、Phpstudy V8.1.1.3、MySQL 5.7.26 同一时间 MySQL 的连接数量有限制&#xff0c;当超过上限时将提示下面错误信息&#xff1a; 1040 - Too many connections 查看当前最大连接数 mysql> show variables like %max_…