自译MSDN片断---重叠I/O和事件对象
2008-03-26 23:35
204 查看
Windows Socket 2支持重叠I/O并要求所有传输层服务提供商也支持这种能力。重叠I/O遵循Windows内部模型,只能在使用带WSA_FLAG_OVERLAPPED标志的WSASocket函数或使用socket函数建立的socket中使用。
注意:建立带重叠属性的socket与该socket当前处于阻塞或非阻塞模式无关。带重叠属性的socket可以被用来执行重叠I/O,这样做并不改变该socket是阻塞模式这一事实。由于重叠I/O操作不阻塞,因此socket是阻塞模式与这些操作无关。
对接收方来说,应用程序使用WSARecv或WSARecvFrom函数提供接收数据的缓冲区。如果在网络收到数据之前事先提供一或多个缓冲区,那么数据在到达时可以被立刻放在缓冲区中。这样就避免了在使用recv或recvfrom函数时发生的拷贝过程。如果数据在缓冲区提交时已经准备好,那它会被立刻拷贝进用户的缓冲区。
如果在数据到达时应用程序没有提交缓冲区,网络的行为与同步操作时类似。就是说,到来的数据在应用程序发出一个接收调用并由此提供一个缓冲区时被拷贝。唯一的例外就是当程序用setsockopt函数把接收缓冲区大小设成0时。在这种情况下,可靠协议只有在应用程序提交了缓冲区时才允许接收数据,而不可靠协议则可能丢失数据。
对发送方来说,应用程序用WSASend或WSASentTo提供指向填充好的缓冲区的指针,并保证不在网络发完缓冲区的内容之前修改缓冲区。
重叠模式下,发或收调用会立刻返回。
返回0表示I/O操作已经完成,对应的完成指示也已发生。即关联的事件对象已被激活,或者完成例程已经放入队列并将在调用线程进入可改变的wait状态时执行。
返回SOCKET_ERROR且错误代码是WSA_IO_PENDING表示重叠操作已经成功地发动,当发送缓冲区被发完或接收操作完成时会有后续指示。但是,对于字节流形式的socket来说,完成指示只有在进来的数据收完时才发出,而不管缓冲区是否是满的。其它的错误代码都表示重叠操作未成功启动,也没有后续的完成指示。
收和发都可以是重叠的。可多次调用接收函数为到来的数据准备缓冲区,也可多次调用发送函数将多个缓冲区列队发送。应用程序可以确信多个重叠发送缓冲区是按照指定顺序发送的,但对应的完成指示可能以不同的顺序发生。同样,在接收时缓冲区按照被提供时的顺序填充,但完成指示可以以不同顺序发生。
不能取消指定socket上的单独某一个重叠操作。但是,可以用closesocket关闭该socket,以此事实上中止所有未完成操作。
WSAIoctl也可以用重叠I/O的延期完成特性,它是ioctlsocket的增强版。
标题:MSDN片断---重叠I/O和事件对象
来源:MSDN2005(ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/winsock/winsock/overlapped_i_o_and_event_objects_2.htm)
译者:dwBreakHeart
时间:2008年3月26日
注意:建立带重叠属性的socket与该socket当前处于阻塞或非阻塞模式无关。带重叠属性的socket可以被用来执行重叠I/O,这样做并不改变该socket是阻塞模式这一事实。由于重叠I/O操作不阻塞,因此socket是阻塞模式与这些操作无关。
对接收方来说,应用程序使用WSARecv或WSARecvFrom函数提供接收数据的缓冲区。如果在网络收到数据之前事先提供一或多个缓冲区,那么数据在到达时可以被立刻放在缓冲区中。这样就避免了在使用recv或recvfrom函数时发生的拷贝过程。如果数据在缓冲区提交时已经准备好,那它会被立刻拷贝进用户的缓冲区。
如果在数据到达时应用程序没有提交缓冲区,网络的行为与同步操作时类似。就是说,到来的数据在应用程序发出一个接收调用并由此提供一个缓冲区时被拷贝。唯一的例外就是当程序用setsockopt函数把接收缓冲区大小设成0时。在这种情况下,可靠协议只有在应用程序提交了缓冲区时才允许接收数据,而不可靠协议则可能丢失数据。
对发送方来说,应用程序用WSASend或WSASentTo提供指向填充好的缓冲区的指针,并保证不在网络发完缓冲区的内容之前修改缓冲区。
重叠模式下,发或收调用会立刻返回。
返回0表示I/O操作已经完成,对应的完成指示也已发生。即关联的事件对象已被激活,或者完成例程已经放入队列并将在调用线程进入可改变的wait状态时执行。
返回SOCKET_ERROR且错误代码是WSA_IO_PENDING表示重叠操作已经成功地发动,当发送缓冲区被发完或接收操作完成时会有后续指示。但是,对于字节流形式的socket来说,完成指示只有在进来的数据收完时才发出,而不管缓冲区是否是满的。其它的错误代码都表示重叠操作未成功启动,也没有后续的完成指示。
收和发都可以是重叠的。可多次调用接收函数为到来的数据准备缓冲区,也可多次调用发送函数将多个缓冲区列队发送。应用程序可以确信多个重叠发送缓冲区是按照指定顺序发送的,但对应的完成指示可能以不同的顺序发生。同样,在接收时缓冲区按照被提供时的顺序填充,但完成指示可以以不同顺序发生。
不能取消指定socket上的单独某一个重叠操作。但是,可以用closesocket关闭该socket,以此事实上中止所有未完成操作。
WSAIoctl也可以用重叠I/O的延期完成特性,它是ioctlsocket的增强版。
标题:MSDN片断---重叠I/O和事件对象
来源:MSDN2005(ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/winsock/winsock/overlapped_i_o_and_event_objects_2.htm)
译者:dwBreakHeart
时间:2008年3月26日
相关文章推荐
- 原:自译MSDN片断---同步和重叠I/O
- WINDOWS SOCKET 重叠I/O 事件对象
- 重叠模型--事件对象通知
- 重叠I/O之事件对象通知
- 事件对象相关函数与例子(MSDN)
- 重叠I/O之事件对象通知
- 深入理解DOM事件机制系列第三篇——事件对象
- ucosIII 事件标志组、同时等待多个内核对象、存储管理
- 事件对象
- 2.javascript中的事件对象【学习笔记】
- Event事件对象之表单事件
- JavaScript 事件流、事件处理程序及事件对象总结
- JavaScript之jQuery-4 jQuery事件(页面加载后执行、事件处理、事件冒泡、事件对象、模拟操作)
- jacascript 事件对象event
- 事件的简单解释(转msdn)
- System.ArgumentException 位于 System.Windows.Forms.dll 源对象不公开“IPropertyNotifySink”事件接口
- 事件驱动的JScript面对对象编程(例)
- Ajax对象XMLHttpRequest的常用属性,方法和事件
- 001_关于循环绑定事件函数中的对象索引值与this
- ASP.NET 页面对象模型 (MSDN)