yuyunliuhen

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  3 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

常用链接

留言簿

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

WSARecv Function 从连接的SOCKET中接收数据

int WSARecv(
  __in          SOCKET s,
  __in_out      LPWSABUF lpBuffers,
  __in          DWORD dwBufferCount,
  __out         LPDWORD lpNumberOfBytesRecvd,
  __in_out      LPDWORD lpFlags,
  __in          LPWSAOVERLAPPED lpOverlapped,
  __in          LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);

返回值:
如果函数调用发生错误,接收操作立即返回0。这种情况下,这个完成例程将会被列入即将调用的时间表当线程变为警告状态, 否则,函数返回SOCKET_ERROR,我们可以通过WSAGetLastError获取错误代码. WSA_IO_PENDING表示这个重叠操作成功初始化,稍后便会显示。

备注:
WSARecv提供recv几个额外的重要功能:
可以进行套接字重叠进行重叠recv操作.
允许多个接收缓冲区,使其适应于聚集/分散I/O类型。

WSARecv函数通过参数 s 指定连接的SOCKETS 或者绑定未连接的SOCKETS 来读取未接收的数据。SOCKETS的本地地址是必须知道的。在服务器应用程序中,SOCKET通常显式通过bind绑定或者通过隐式的通过accept,WSAAccept绑定;在客户点应用程序中,SOCKET通过connect,WSAConnect,Sento,WSASendTo或者WSAJoinLeaf隐式的绑定本地地址。

对于连接和非连接的SOCKET,这个函数通过accept接收的消息限制地址,它仅仅对指定远程地址返回消息,忽略其他地址发送的消息。

对于重叠的SOCKETS,WSARecv通常投递一个或多个可以填充数据的缓冲区,申请完成后等待指定的完成指示(调用的完成例程或事件对象设置)发生,如果这个操作不能马上完成,最终的完成状态可以通过完成例程或WSAGetOverlappedResult获取.
所有的I/O在线程创建时初始化,线程退出时取消,对于重叠的SOCKETS,如果线程关闭,未决的异步操作可能会在完成之前失败。


如果 lpOverlapped ,lpCompletionRoutine 都NULL,SOCKET 在这个函数中被认为是非重叠的SOCKET。

对于非重叠的SOCKETS,阻塞的语意与recv相同,且lpOverlapped ,lpCompletionRoutine都会被忽略,任何已经收到和传输缓冲的数据将被复制到指定的用户缓冲区,如果当前没有收到数据或没有任何数据传输,SOCKET将被阻塞,直到接收到数据。Window Socket 2没有为这个函数定义任何的标准阻塞超时机制。
基于字节流的协议栈试图尽可能返回多的可用的缓冲区空间和可接收的数据。然而,单个字节足够疏通这次调用,而且也没有任何可以保证返回多余一个字节。而基于消息的协议,则发送个完整的数据包。(字节流的协议和基于消息的协议的主要区别)。

 


 

posted on 2010-03-20 17:48 CleanSky 阅读(1104) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理