Albert在云端

行必果、自由行、有梦想、侠义行!

导航

CAsyncSocket::OnSend、Send以及WSAEWOULDBLOCK的理解

1、Send函数返回socket_error时,此时数据没有发送是确定的,如果返回WSAEWOULDBLOCK,表明程序将要异步发送,所有需要发送的数据都要缓存起来,等待OnSend()下次发送。
2、所有发送的数据不要直接用Send函数直接发送,而是要将数据缓存闲来,一起放到OnSend函数中用Send函数发送数据。这样所有的数据统一管理。
3、2中的缓冲区大小需要做一个限定,即a、网络在联通前不要允许发送数据。b、网络断开后不要发送数据。c、缓冲区的大小要设置的合理,如果网速快,缓冲区一定是够用的,如果不够用,说明需要调用者等待网络数据发送完再发送(很明显网络带宽有限定,你不能在1MB带宽的网络情况下,连续发送几GB的电影文件,当然要慢慢的发送。)

说明:以上理论需要测试,请等待

引用msdn上的代码,很能说明问题:

// 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);
}

 

posted on 2013-12-30 14:34  Albert在云端  阅读(2132)  评论(0)    收藏  举报