自译MSDN片断---重叠I/O和事件对象

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日
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值