关于 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. 据说有发送了一半的情况?是这样吗? 如果有这种情况的话,这算是成功还是失败?接下来怎么办?