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); }
浙公网安备 33010602011771号