最后更新:2022-01-18 04:49:40 手机定位技术交流文章
异步方式处理I/O的方法。
同一线程内部向多个目标传输(或从多个目标接收)数据引起的I/O重叠现象。
需要调用的I/O函数立即返回,非阻塞异步。
Windows中重叠I/O的重点并非I/O本身,而是如何确认I/O完成时的状态。非阻塞模式的输入输出需要另外确认执行结果。
Windows平台下重叠I/O模型由非阻塞异步I/O函数和确认I/O完成状态的方法组成。
//重叠I/O的非阻塞模式的套接字
WSASocket(PF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
lpOverlapped传递NULL,WSASend函数中套接字将以阻塞方式工作。
WSASend函数同时向多个目标传输数据时,需要分别构建WSAOVERLAPPED结构体变量(操作系统会使用)。
若输出缓冲为空,且传输数据不大,WSASend函数调用后可以立即完成数据传输。此时WSASend函数返回0,lpNumberOfBytesSent将保存实际传输数据大小。否则返回SOCKET_ERROR,并将WSA_IO_PENDING注册为错误代码(通过WSAGetLastError函数得到),通过如下函数获取实际传输的数据大小。
OverlappedSend_win.c
OverlappedRecv_win.c
注册CR(Completion Routine):Pending的I/O完成时调用此函数。
Completion Routine函数的运作方式,I/O完成时调用注册过的函数进行事后处理。
为了避免CR函数调用破坏程序的正常执行流,操作系统预先定义规则:只有请求I/O的线程处于alertable wait状态时才能调用CR函数。
alertable wait状态是等待接收操作系统消息的线程状态。
调用下列函数进入alertable wait状态。
WaitForSingleObjectEx、WaitForMultipleObjectsEx、SleepEx在WaitForSingleObject、WaitForMultipleObjects、Sleep上增加一个参数,若为TRUE,则相应线程进入alertable wait状态。
WSA为前缀的函数,最后一个参数设置为TRUE,则线程进入alertable wait状态。
启动I/O任务后,执行完紧急任务时可以调用上述任一函数验证I/O完成与否。此时操作系统知道线程进入alertable wait状态,若有已完成的I/O,调用相应CR函数。调用后,上述函数全部返回WAIT_IO_COMPLETION,并开始执行接下来的程序。
CmplRoutinesRecv_win.c
本文由 在线网速测试 整理编辑,转载请注明出处 。