共有五种类型的套接字I/O模型,可让Winsock应用程序对I/O进行管理,它们包括:select(选择)、WSAAsyncSelect(异步选择)、WSAEventSelect(事件选择)、overlapped(重叠)以及completion port(完成端口)
1.select
最初设计该模型,主要是面向某些使用Unix操作系统的计算机.使用大概原理设置一个集合,通过一个宏的定义来查询集合类的套接字可否使用。做个端口扫描用这个还是比较开心的。
2.WSAAsyncSelect
模仿WINDOWS消息机制来实现,使用起来很方便。个人比较喜欢。MFC中的CSOCKET也采用了这个模型。
相关函数:
int WSAAsyncSelect(SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent);
lEvent表示一个掩码组合,比如FD_CONNECT|FD_READ
LREWULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
wParam: 发生了一个网络事件的套接字
lParam: (低位)指定了已经发生的网络事件WSAGETSELECTEVENT (高位)包含了可能出现的任何错误代码 用WSAGETSELECTERROR获取
大概使用框架如下:
创建套接字,使用WSAAsyncSelect进行套接字和事件绑定,在回调函数中写清消息响应
#define WM_SOCKET WM_USER+1
int WINAPI WinMain(HINSTANCE hINstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
SOCKET Listen;
HWND Window;
//Create a window and assign the winproc
//Start Winsock and create a socket
WSAStartup(...);
Listen = Socket();
bind(...);
WSAAsyscSelect(Listen, Window, WM_SOCKET, FD_ACCEPT | FD_CLOSE);
listen(Listen, 5);
}
BOOL CALLBACK WinProc(HWND hDlg, WORD wMsg, WORD wParam, DWORD lParam)
{
SOCKET Accept;
switch(wMsg)
{
case WM_SOCKET:
//whether an error occurred on the socket by using the WSAGETSELECTERROR() macro
if(WSAGETSELECTERROR(lParam))
{
closesocket...
}
//what event occurred on the socket
switch( WSAGETSELECTEVENT(lParam) )
{
case FD_ACCEPT:
case FD_READ:
case FD_WRITE:
}
}
}
FD_WRITE说明:三种条件下才会发出
使用connect WSAConnect,一个套接字首次建立连接
使用accept WSAAccept,套接字被接受以后
若send WSASend sendto WSASendTo操作失败,返回WSAEWOULDBLOCK错误,而且缓冲区空间变得可用
也就是说,收到首条FD_WRITE消息,便应认为自己必然能在一个套接字上发数据.
3 WSAEventSelect
你可以想象着,一排的空套接字等着对方的连接...
如上章所述,async投递一个窗口例程,而Event投递一个事件对象句柄.
或者更清楚解释为,套接字和事件对象对应着,当一个套接字有事件发生,事件对象返回相应的值,通过这个值来索引这个套接字。
要注意该模式里两种工作状态和模式,signaled/nonsignaled manual reset/auto reset
一开始默认为未传信(nonsignaled)和人工重设(manual reset)状态,随着网络事件的触发,工作状态从未船信到已传信.在完成一个I/O请求处理后,要负责将工作状态改变
首先创建一个事件对象 WSAEVENT WSACreateEvent(void);
其次将事件对象和套接字联系在一起 int WSAEventSelect(SOCKET s, WSAEVENT hEventObject, long lNetworkEvents);
等待网络事件触发事件对象句柄状态 DWORD WSAWaitForMultipleEvents(....DWORD dwTimeout, BOOL fAlertable);
dwTimeout参数规定等待一个网络事件发生有多长时间,毫秒为单位.超过立即返回,即使由fWaitAll参数规定条件未满足也如此.如果设为0,函数会检测指定的事件对象状态,然后返回.这样造成一个"轮询",尽量避免设为0.若设为WSA_INFINITE,那么只有在一个网络事件传回一个事件对象后,才会返回.
fAlertable:忽略,设为FALSE,主要用于重叠式I/O模型中
将已传信状态更改为未传信 BOOL WSAResetEvent(WSAEVENT hEvent);
释放事件句柄使用的系统资源 BOOL WSACloseEvent(WSAEVENT hEvent);
现在还需解决的一问题是,怎么获得发生事件的套接字,async直接用一个socket变量接收,而在event里,是通过事先的一个数组索引获得.这个方法名为WSAEnumNetworkEvents();
代码框架如下:
//先创建事件数组和套接字数组
SOCKET Socket[常量];
WSAEVENT Event[];
DWORD EvenTotal = 0;
//这里进行套接字准备到bind那步,创建一个事件,并且联系
NewEvent = WSACreateEvent();
WSAEventSelect(Listen, NewEvent, FD_ACCEPT|FD_CLOSE);
//最重要一步,加入到数组
Socket[EventTotal] = Listen;
Event[EventTotal] = NewEvent;
EventTotal++;
while(TRUE)
{
//等待一个套接字连接
Index = WSAWaitForMultipleEvents(..);
//在EnumNetworkEvents中进行查询,判断在哪个套接字上,发生什么网络事件类型.
WSAEnumNetworkEvents(
SocketArray[Index - WSA_WAIT_EVENT_0],
EventArray[Index - WSA_WAIT_EVENT_0],
NetworkEvents);
}
对一个发生事件套接字操作
WSAWaitForMultipleEvents返回值:减去预定值WSA_WAIT_EVENT_0
Iindex = WSAWaitForMultipleEvents(..);
MyEvent = EventArray[Index - WSA_WAIT_EVENT_0];
接下来可调用WSAEnumNetworkEvents函数,调查发生什么类型网络事件
4IO重叠
对一个套接字多次利用,利用CRITICAL_SECTION来进行互斥
5。。。略
分享到:
相关推荐
qtz40塔式起重机总体及塔身有限元分析法设计().zip
Elasticsearch是一个基于Lucene的搜索服务器
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
美国纽约HVAC(暖通空调)数据示例,谷歌地图数据包括:时间戳、名称、类别、地址、描述、开放网站、电话号码、开放时间、更新开放时间、评论计数、评级、主图像、评论、url、纬度、经度、地点id、国家等。 在地理位置服务(LBS)中,谷歌地图数据采集尤其受到关注,因为它提供了关于各种商业实体的详尽信息,这对于消费者和企业都有极大的价值。本篇文章将详细介绍美国纽约地区的HVAC(暖通空调)系统相关数据示例,此示例数据是通过谷歌地图抓取得到的,展示了此技术在商业和消费者领域的应用潜力。 无需外网,无需任何软件抓取谷歌地图数据:wmhuoke.com
2023-04-06-项目笔记-第四百五十五阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.453局变量的作用域_453- 2025-04-01
1_实验三 扰码、卷积编码及交织.ppt
北京交通大学901软件工程导论必备知识点.pdf
内容概要:本文档总结了 MyBatis 的常见面试题,涵盖了 MyBatis 的基本概念、优缺点、适用场合、SQL 语句编写技巧、分页机制、主键生成、参数传递方式、动态 SQL、缓存机制、关联查询及接口绑定等内容。通过对这些问题的解答,帮助开发者深入理解 MyBatis 的工作原理及其在实际项目中的应用。文档不仅介绍了 MyBatis 的核心功能,还详细解释了其在不同场景下的具体实现方法,如通过 XML 或注解配置 SQL 语句、处理复杂查询、优化性能等。 适合人群:具备一定 Java 开发经验,尤其是对 MyBatis 有初步了解的研发人员,以及希望深入了解 MyBatis 框架原理和最佳实践的开发人员。 使用场景及目标:①理解 MyBatis 的核心概念和工作原理,如 SQL 映射、参数传递、结果映射等;②掌握 MyBatis 在实际项目中的应用技巧,包括 SQL 编写、分页、主键生成、关联查询等;③学习如何通过 XML 和注解配置 SQL 语句,优化 MyBatis 性能,解决实际开发中的问题。 其他说明:文档内容详尽,涵盖面广,适合用于面试准备和技术学习。建议读者在学习过程中结合实际项目进行练习,以更好地掌握 MyBatis 的使用方法和技巧。此外,文档还提供了丰富的示例代码和配置细节,帮助读者加深理解和应用。
《基于YOLOv8的智能电网设备锈蚀评估系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计
插头模具 CAD图纸.zip
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
《基于YOLOv8的智慧农业水肥一体化控制系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计
python爬虫;智能切换策略,反爬检测机制
台区终端电科院送检文档
e235d-main.zip
丁祖昱:疫情对中国房地产市场影响分析及未来展望
MCP快速入门实战,详细的实战教程
YD5141SYZ后压缩式垃圾车的上装箱体设计.zip
IMG_20250401_195352.jpg
DeepSeek系列专题 DeepSeek技术溯源及前沿探索.pdf