CAsyncSocket::Send()、OnSend()

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

Dialog中Socket设置AsyncSelect(FD_WRITE),触发虚函数OnSend(),之后调用Send()发送消息。

参数

lpBuf
包含要传输的数据的缓冲区。

nBufLen
中的数据的长度lpBuf以字节为单位。

nFlags
指定在其中进行调用的方式。 此函数的语义由套接字选项和nFlags参数。 后者通过组合构成的以下值中任意使用 c + +OR运算符︰

  • MSG_DONTROUTE数据应该不会受到路由的指定。 Windows 套接字供应商可以选择忽略此标志。

  • MSG_OOB发送带外数据 ( SOCK_STREAM仅)。

返回值

如果没有出现错误,发送返回发送字符的总数。 (请注意,这可以是由指示的数字小于nBufLen。)否则为值为SOCKET_ERROR返回,并且可以通过调用检索特定的错误代码GetLastError。 以下错误适用于该成员函数︰

  • WSANOTINITIALISED成功AfxSocketInit使用此 API 之前必须发生。

  • WSAENETDOWN Windows 套接字实现检测到的网络子系统失败。

  • WSAEACCES请求的地址是广播的地址,但未设置适当的标志。

  • 返回 WSAEINPROGRESS正在阻塞的 Windows 套接字操作。

  • WSAEFAULT lpBuf参数不是用户地址空间的有效部分。

  • WSAENETRESET必须重置该连接,因为 Windows 套接字实现将其删除。

  • WSAENOBUFSWindows 套接字实现报告缓冲区死锁。

  • WSAENOTCONN套接字未连接。

  • WSAENOTSOCK描述符不是一个套接字。

  • WSAEOPNOTSUPP MSG_OOB指定了,但对套接字类型不是SOCK_STREAM

  • WSAESHUTDOWN的套接字关闭; 不能调用发送后套接字上ShutDown已调用了与nHow设置为 1 或 2。

  • WSAEWOULDBLOCK套接字被标记为非阻塞和所请求的操作将阻塞。

  • WSAEMSGSIZE套接字是类型的SOCK_DGRAM,并且大于支持的 Windows 套接字实现最大数据报。

  • WSAEINVAL尚未与绑定套接字绑定

  • WSAECONNABORTED由于超时或其他故障虚拟线路已中止。

  • WSAECONNRESET虚拟线路已重置的远程端。


  • virtual void OnSend( 
       int nErrorCode  
    );
    // CMyAsyncSocket is derived from CAsyncSocket and defines the  
    // following variables: 
    //    CString  m_sendBuffer;   //for async send 
    //    int      m_nBytesSent; 
    //    int      m_nBytesBufferSize; 
    void CMyAsyncSocket::OnSend(int nErrorCode)
    {
       while (m_nBytesSent < m_nBytesBufferSize)
       {
          int dwBytes;
    
          if ((dwBytes = Send((LPCTSTR)m_sendBuffer + m_nBytesSent, 
             m_nBytesBufferSize - m_nBytesSent)) == SOCKET_ERROR)
          {
             if (GetLastError() == WSAEWOULDBLOCK)
           {
              break;
           }
             else
             {
                TCHAR szError[256];
                _stprintf_s(szError, _T("Server Socket failed to send: %d"), 
                   GetLastError());
                Close();
                AfxMessageBox (szError);
             }
          }
          else
          {
             m_nBytesSent += dwBytes;
          }
       }
    
       if (m_nBytesSent == m_nBytesBufferSize)
       {
          m_nBytesSent = m_nBytesBufferSize = 0;
          m_sendBuffer = _T("");
       }
    
       CAsyncSocket::OnSend(nErrorCode);
    }





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值