CAsyncSocket::Receive()、OnReceive()

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

首先设置Socket感兴趣的事件AsyncSelect(FD_READ)参数
,之后虚函数OnReceive()一直扫描,当扫描到要接收的数据时,调用Receive()接收数据。
lpBuf

输入数据的缓冲区。
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);
}



06-12 343
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值