CAsyncSocket::Receive

virtual int Receive( void* lpBuf, int nBufLen, int nFlags = 0 );

返回值:
调用成功时,返回接收到的字节数。如果连接被关闭了,返回0;否则返回SOCKET_ERROR,可以调用GetLastError得到特定的错误代码。此成员函数可用的错误代码有:
·WSANOTINITIALISED调用本API函数之前必须成功执行了AfxsocketInit函数。
·WSAENETDOWNWindows Sockets检测到网络系统故障。
·WSAENOTCONN套接字没有连接上。
·WSAEINPROGRESS正在进行成块的Windows Sockets操作。
·WSAENOTSOCK描述符不是一个套接字
·WSAEOPNOTSUPP设置了MSG_OOB,但是套接字的类型不是SOCK_ STREAM。
·WSAESHUTDOWN套接字已经被关闭。调用ShutDown(参数nHow的值设为0或2)后,就不能在该套接字上调用Receive了。
·WSAEWOULDBLOCK套接字标志为非成块,而Receive操作将产生成块。
·WSAEMSGSIZE数据报太大,不能完全放到缓冲中,将被截断。
·WSAEINVAL套接字没有用Bind绑定。
·WSAECONNABORTED由于超时或其它故障使虚电路异常退出。
·WSAECONNRESET远端重置了虚电路。

参数:
lpBuf输入数据的缓冲。
nBufLenlpBuf的大小(字节数)。
nFlags设置调用模式。本函数的语义由套接字选项和nFlags参数共同决定。nFlags由下面的任一个值组成,也可以用C++的OR操作符组合使用:
·MSG_PEEK把数据拷贝到缓冲,但不从输入队列上移走。
·MSG_OOB处理带外数据(请参阅联机文档“Win32 SDK”中的“Windows套接字编程注意事项”)

说明:
本函数用于从套接字获取数据。它从已连接的流套接字或数据报套接字上读输入的数据。对于流套接字(SOCK_STREAM类型的套接字),本函数返回缓冲中不超过缓冲大小的所有有效数据。如果套接字被设置成在线接收带外数据(套接字选项为SO_OOBINLINE),并且带外数据没有被读,则仅仅返回带外数据。应用可以使用IOCtl的SIOCATMARK选项或者OnOutOfBandData来检测是否还有未读的带外数据。对于数据报套接字,本函数从第一个入队的数据报中解出数据,发到缓冲中。如果数据报比缓冲大,则缓冲中仅包含数据报的前一部分,而丢弃其它的数据,Receive返回SOCKET_ERROR,错误代码设成WSAEMSGSIZE。如果套接字中没有输入数据,则返回SOCKET_ERROR,并把错误代码设为WSAEWOULD-BLOCK。当更多的数据到达时,可用回调函数OnReceive来检测。如果套接字是SOCK_STREAM类型的,并且远端接点已经正常地关闭连接,Receive会立即返回,接收的数据当然是0字节。如果连接被重置了,Receive将会异常返回,错误代码为WSAECONNRESET。

请参阅:
CAsyncSocket::AsyncSelect, CAsyncSocket::Create, CAsyncSocket::ReceiveFrom, CAsyncSocket::Send