virtual int Receive(
void* lpBuf,
int nBufLen,
int nFlags = 0
);
首先设置Socket感兴趣的事件AsyncSelect(FD_READ)参数
,之后虚函数OnReceive()一直扫描,当扫描到要接收的数据时,调用Receive()接收数据。
lpBuf
输入数据的缓冲区。
nBufLen
lpBuf 的字节长度。
nFlags
nBufLen
lpBuf 的字节长度。
nFlags
指定调用了的方式。
套接字选项和参数 nFlags 依赖于此函数语义。
后者将以下值中的任何一个构造与C++ OR 运算符
:
在详细介绍数据的MSG_PEEK 偷看。
该数据复制到缓冲区,但从输入队列不会被取消。
-
MSG_OOB 处理带外数据。
如果未发生错误,Receive 返回接收到的字节数。 如果连接已关闭,则返回0。 否则,SOCKET_ERROR 的值返回,并且,特定错误代码可以通过调用 GetLastError检索。 下面的错误适用于此成员函数:
WSANOTINITIALISED 的成功的 AfxSocketInit 必须在使用此API之前发生。
WSAENETDOWN Windows套接字实现检测网络子系统失败。
WSAENOTCONN 套接字未连接。
块Windows套接字操作的WSAEINPROGRESS 的进度中。
WSAENOTSOCK 描述符不是套接字。
WSAEOPNOTSUPP MSG_OOB 指定了,但是,套接字不是类型 SOCK_STREAM。
WSAESHUTDOWN 套接字已关闭;,在 ShutDown 调用具有 nHow 设置为0或2.后,调用套接字的 Receive 是不可能的。
WSAEWOULDBLOCK 套接字标记为未占用,并 Receive 操作将阻止。
WSAEMSGSIZE 中的数据进行太大而无法放入指定缓冲区和被截断。
WSAEINVAL 套接字尚未绑定与 Bind。
WSAECONNABORTED 虚拟电路中止的是由于超时或其他故障。
虚拟电路远程重置WSAECONNRESET。
virtual void OnReceive( int nErrorCode );
void CMyAsyncSocket::OnReceive(int nErrorCode) // CMyAsyncSocket is // derived from CAsyncSocket { static int i = 0; i++; TCHAR buff[4096]; int nRead; nRead = Receive(buff, 4096); switch (nRead) { case 0: Close(); break; case SOCKET_ERROR: if (GetLastError() != WSAEWOULDBLOCK) { AfxMessageBox (_T("Error occurred")); Close(); } break; default: buff[nRead] = _T('\0'); //terminate the string CString szTemp(buff); m_strRecv += szTemp; // m_strRecv is a CString declared // in CMyAsyncSocket if (szTemp.CompareNoCase(_T("bye")) == 0) { ShutDown(); s_eventDone.SetEvent(); } } CAsyncSocket::OnReceive(nErrorCode); }