当利用SendData()函数连续发送数据的时候,遇到了发送失败,此时发送就以失败而告终,代码如下:
void CClientSocket::OnSend(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
if(m_pObOutBuffer!=NULL)
{
if(SendData())
{
m_nSendLen = 0;
delete m_pObOutBuffer;
m_pObOutBuffer= NULL;
}
else
AsyncSelect();
}
else
{
m_csOutBuffer.Lock();
if(!m_OutBufferList.IsEmpty())
{
m_nSendLen = 0;
m_pObOutBuffer = m_OutBufferList.GetHead();
POSITION pos = m_OutBufferList.GetHeadPosition();
m_OutBufferList.RemoveAt(pos);
if(SendData())
{
m_nSendLen = 0;
delete m_pObOutBuffer;
m_pObOutBuffer = NULL;
}
}
if(!m_OutBufferList.IsEmpty())
AsyncSelect();
m_csOutBuffer.Unlock();
} CAsyncSocket::OnSend(nErrorCode);
}为是么老是发生发送数据阻塞的现象呢?即在下面的函数中nSendLen==-1,这种情况是在连续发送一个数据包后出现了,大家帮我分析分析以下,该怎么处理呀
BOOL CClientSocket::SendData()
{
static int iCounts = 0;
if(m_nSendLen >= MAX_PACK_LEN)
{
return TRUE;
}
BYTE *pBuff = m_pObOutBuffer->m_buff+m_nSendLen;
int nSendLen = Send(pBuff,MAX_PACK_LEN-m_nSendLen);
if(nSendLen==SOCKET_ERROR)
{
int iError = GetLastError();
if (iError==WSAEWOULDBLOCK)
AsyncSelect();
else
{
CString str;
str.Format("发生网络错误: %d",iError);
AfxMessageBox(str,MB_OK);
return FALSE;
}
}
else
{
m_nSendLen += nSendLen;
if (nSendLen>=MAX_PACK_LEN)
{
MSGHEAD *pHead = (MSGHEAD *)m_pObOutBuffer->m_buff;
TRACE("The package is %d ,iPackageID = %d\n",iCounts++,pHead->iPackageID);
return TRUE;
}
else
AsyncSelect();
}
return FALSE;
}
为什么呢?
请教该怎么处理呢?
void CClientSocket::OnSend(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
if(m_pObOutBuffer!=NULL)
{
if(SendData())
{
m_nSendLen = 0;
delete m_pObOutBuffer;
m_pObOutBuffer= NULL;
}
else
AsyncSelect();
}
else
{
m_csOutBuffer.Lock();
if(!m_OutBufferList.IsEmpty())
{
m_nSendLen = 0;
m_pObOutBuffer = m_OutBufferList.GetHead();
POSITION pos = m_OutBufferList.GetHeadPosition();
m_OutBufferList.RemoveAt(pos);
if(SendData())
{
m_nSendLen = 0;
delete m_pObOutBuffer;
m_pObOutBuffer = NULL;
}
}
if(!m_OutBufferList.IsEmpty())
AsyncSelect();
m_csOutBuffer.Unlock();
} CAsyncSocket::OnSend(nErrorCode);
}为是么老是发生发送数据阻塞的现象呢?即在下面的函数中nSendLen==-1,这种情况是在连续发送一个数据包后出现了,大家帮我分析分析以下,该怎么处理呀
BOOL CClientSocket::SendData()
{
static int iCounts = 0;
if(m_nSendLen >= MAX_PACK_LEN)
{
return TRUE;
}
BYTE *pBuff = m_pObOutBuffer->m_buff+m_nSendLen;
int nSendLen = Send(pBuff,MAX_PACK_LEN-m_nSendLen);
if(nSendLen==SOCKET_ERROR)
{
int iError = GetLastError();
if (iError==WSAEWOULDBLOCK)
AsyncSelect();
else
{
CString str;
str.Format("发生网络错误: %d",iError);
AfxMessageBox(str,MB_OK);
return FALSE;
}
}
else
{
m_nSendLen += nSendLen;
if (nSendLen>=MAX_PACK_LEN)
{
MSGHEAD *pHead = (MSGHEAD *)m_pObOutBuffer->m_buff;
TRACE("The package is %d ,iPackageID = %d\n",iCounts++,pHead->iPackageID);
return TRUE;
}
else
AsyncSelect();
}
return FALSE;
}
为什么呢?
请教该怎么处理呢?
AsyncSelect();
WSAEWOULDBLOCK错误系统会自动产生OnSend的,如果自己AsyncSelect();是不是就多了