关于 WSASend/WSARecv 和重叠IO的几个问题?
书上:
[Quote= Overlapped I/O事件通知模型:]
重叠I/O的事件通知方法要求将Win32事件对象与WSAOVERLAPPED结构关联在一起。若使用一个WSAOVERLAPPED结构,发出像WSASend和WSARecv这样的I/O调用,它们会立即返回。
通常,这些I/O调用会以失败告终,返回SOCKET_ERROR 。
一个重叠请求操作最终完成之后,在事件通知方法中,Winsock会更改与一个WSAOVERLAPPED结构对应的一个事件对象的事件传信状态,将其从“未传信”变成“已传信”。发现一次重叠请求完成之后,接着需要调用WSAGetOverlappedResult(取得重叠结构)函数,判断该重叠调用到底是成功,还是失败。
……
重叠I / O编程步骤为:
1) 创建一个套接字,开始在指定的端口上监听连接请求。
2) 接受一个进入的连接请求。
3) 为接受的套接字新建一个WSAOVERLAPPED结构,并为该结构分配一个事件对象句柄。也将事件对象句柄分配给一个事件数组,以便稍后由WSAWaitForMultipleEvents函数使用。
4) 在套接字上投递一个异步WSARecv请求,指定参数为WSAOVERLAPPED结构。注意函数通常会以失败告终,返回SOCKET_ERROR错误状态WSA_IO_PENDING(I/O操作尚未完成)。
5) 使用步骤3 )的事件数组,调用WSAWaitForMultipleEvents函数,并等待与重叠调用关联在一起的事件进入“已传信”状态(即,等待那个事件的“触发”)。
6) WSAWaitForMultipleEvents函数完成后,针对事件数组,调用WSAResetEvent(重设事件)函数,复位事件对象,并对完成的重叠请求进行处理。
7) 使用WSAGetOverlappedResult函数,判断重叠调用的返回状态是什么。
8) 在套接字上投递另一个重叠WSARecv请求。
9) 重复步骤5 ) ~ 8 )。
[/Quote]
1. 立即返回,这个“立即” 是什么含义?
2. 这些I/O调用为什么会通常以失败告终?
3. 既然WSASend的返回值可以判断是否发送成功,那这里为什么还要用WSAWaitForMultipleEvents 这么麻烦 ?
4. 据说有发送了一半的情况?是这样吗? 如果有这种情况的话,这算是成功还是失败?接下来怎么办?
[Quote= Overlapped I/O事件通知模型:]
重叠I/O的事件通知方法要求将Win32事件对象与WSAOVERLAPPED结构关联在一起。若使用一个WSAOVERLAPPED结构,发出像WSASend和WSARecv这样的I/O调用,它们会立即返回。
通常,这些I/O调用会以失败告终,返回SOCKET_ERROR 。
一个重叠请求操作最终完成之后,在事件通知方法中,Winsock会更改与一个WSAOVERLAPPED结构对应的一个事件对象的事件传信状态,将其从“未传信”变成“已传信”。发现一次重叠请求完成之后,接着需要调用WSAGetOverlappedResult(取得重叠结构)函数,判断该重叠调用到底是成功,还是失败。
……
重叠I / O编程步骤为:
1) 创建一个套接字,开始在指定的端口上监听连接请求。
2) 接受一个进入的连接请求。
3) 为接受的套接字新建一个WSAOVERLAPPED结构,并为该结构分配一个事件对象句柄。也将事件对象句柄分配给一个事件数组,以便稍后由WSAWaitForMultipleEvents函数使用。
4) 在套接字上投递一个异步WSARecv请求,指定参数为WSAOVERLAPPED结构。注意函数通常会以失败告终,返回SOCKET_ERROR错误状态WSA_IO_PENDING(I/O操作尚未完成)。
5) 使用步骤3 )的事件数组,调用WSAWaitForMultipleEvents函数,并等待与重叠调用关联在一起的事件进入“已传信”状态(即,等待那个事件的“触发”)。
6) WSAWaitForMultipleEvents函数完成后,针对事件数组,调用WSAResetEvent(重设事件)函数,复位事件对象,并对完成的重叠请求进行处理。
7) 使用WSAGetOverlappedResult函数,判断重叠调用的返回状态是什么。
8) 在套接字上投递另一个重叠WSARecv请求。
9) 重复步骤5 ) ~ 8 )。
[/Quote]
1. 立即返回,这个“立即” 是什么含义?
2. 这些I/O调用为什么会通常以失败告终?
3. 既然WSASend的返回值可以判断是否发送成功,那这里为什么还要用WSAWaitForMultipleEvents 这么麻烦 ?
4. 据说有发送了一半的情况?是这样吗? 如果有这种情况的话,这算是成功还是失败?接下来怎么办?
...全文
相关推荐
基于事件通知的重叠IO模型
在项目设置中,确保启用多线程和Windows套接字2支持。在代码中,你需要创建一个IOCP,为每个socket分配一个关联,然后使用WSASend和WSARecv等函数发起非阻塞的I/O操作。
Windows重叠IO实现C/S程序
在重叠I/O中,WSARecv和WSASend函数用于读写数据,它们都接收一个OVERLAPPED结构体作为参数,该结构体包含了I/O操作的上下文信息。
教你玩转网络编程模型之重叠IO(OVERLAPPERDIO)篇配套代码
本教程将深入讲解重叠IO的概念,并通过配套代码帮助你理解和实践。
重叠I/O类 代码
**资源管理**:类应负责管理套接字、事件对象和`OVERLAPPED`结构体等资源的生命周期,确保在适当的时候关闭和释放。6. **连接管理**:描述中提到没有处理大于64个连接后的监听问题。
Windows Socket五种IO模型
)、重叠 IO 模型(Overlapped I/O)和完成端口模型(Completion Port)。


网络编程
