现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

recv与WSARecv区别

2012-12-06 21:19 工业·编程 ⁄ 共 1036字 ⁄ 字号 暂无评论

对在已连接套接字上接受接入数据来说,recv函数是最基本的方式。它的定义如下:
int recv (
  SOCKET s,  
  char FAR* buf,  
  int len,  
  int flags);

第一个参数s,是准备接收数据的那个套接字。第二个参数buf,是即将收到数据的字符缓冲,而len则是准备接收的字节数或buf缓冲的长度。最后,flags参数可以是下面的值:0、MSG_PEEK或MSG_OOB。另外,还可对这些标志中的每一个进行按位和运算。当然, 0表示无特殊行为。MSG_PEEK会使有用的数据复制到所提供的接收端缓冲内,但是没有从系统缓冲中将它删除。另外,还返回了待发字节数。

WSARecv函数在recv的基础上增加了一些新特性。比如说重叠I/O和部分数据报通知。定义如下:
int WSARecv (
  SOCKET s,  
  LPWSABUF lpBuffers,  
  DWORD dwBufferCount,  
  LPDWORD lpNumberOfBytesRecvd,  
  LPDWORD lpFlags,  
  LPWSAOVERLAPPED lpOverlapped,  
  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionROUTINE);

参数s,是已建立连接的套接字。第二和第三个参数是接收数据的缓冲。lpBuffers参数是一个WSABUF结构组成的数组,而dwBufferCount则表明前一个数组中WSABUF结构的数目。如果接收操作立即完成,lpNumberOfBytesReceived参数就会指向执行这个函数调用所收到的字节数。lpFlags参数可以是下面任何一个值:MSG_PEEK、MSG_OOB、MSG_PARTIAL或者对这些值进行按位和运算之后的结果。

    WSARecvEx函数是微软专有的Winsock 1扩展,除了flags参数是按值引用外,其余和recv函数是一样的。它允许基层的提供者设置MSG_PARTIAL标志。
该函数的原型如下:
int PASCAL FAR WSARecvEx (
  SOCKET s,  
  char FAR * buf,  
  int len,  
  int *flags);
如果收到的数据不是一条完整的消息,flags参数中就会返回MSG_PARTIAL标志。在MSG_PARTIAL标志被当作flags参数的一部分投递,而且收到的消息又不完整时,调用WSARecvEx,就会立即返回收到的那个数据。

给我留言

留言无头像?