BOOL SendAndReceive(unsigned char *pData,int pDataLen)
{
DWORD dwSendBytes = 0, dwTranferBytes = 0, dwRecvdBytes = 0, dwBufLen = 0;
int nErrorCode = 0, nWaitTime =20000;
DWORD dwFlags = 0 ;DWORD dwFlagRev = 0;DWORD dwFlagRevRe = 0;
BOOL bAllTrans = TRUE, bRet = FALSE;
memset(m_chReceivebuf, 0 ,sizeof(char) * MAXMSGBUFLEN);
m_nReceiveLength = 0;
WSAResetEvent(m_hConnectEvent);
WSAOVERLAPPED olOverlap;
memset(&olOverlap, 0, sizeof(olOverlap));
olOverlap.hEvent = m_hConnectEvent;
HANDLE pEvent[HMSOCKET_EVTCOUNT] = {m_hTerminateEvent, m_hConnectEvent};
CString strTemp;
strTemp = pData;
WSABUF pDataBuf;
pDataBuf.len = pDataLen;
pDataBuf.buf = (char *)pData;
WSABUF pDataBufRev;
pDataBufRev.buf = new char[MAXMSGBUFLEN];
memset(pDataBufRev.buf,0,sizeof(char)*MAXMSGBUFLEN);
pDataBufRev.len = MAXMSGBUFLEN;
int nRet = WSASend(m_phConnectSocket, &pDataBuf, 1, &dwSendBytes, 0, &olOverlap, NULL);
if((nRet == SOCKET_ERROR) && (WSA_IO_PENDING != (nErrorCode = WSAGetLastError())))
{
nErrorCode = WSAGetLastError();
return FALSE;
}
DWORD ret_Obj = WaitForMultipleObjects(HMSOCKET_EVTCOUNT, pEvent, FALSE, nWaitTime);
if(WAIT_TIMEOUT == ret_Obj)
{
//delete [] pDataBuf.buf;
//pDataBuf.buf = NULL;
///connection is dead
//error code
delete [] pDataBufRev.buf;
pDataBufRev.buf = NULL;
return FALSE;
}
if(WAIT_OBJECT_0 + HMTERMINATE_EVT == ret_Obj)
{
delete [] pDataBufRev.buf;
pDataBufRev.buf = NULL;
return FALSE;
}
if(WAIT_OBJECT_0 + HMSOCKET_SOCKEVT == ret_Obj)
{
WSAResetEvent(m_hConnectEvent);
bRet = WSAGetOverlappedResult(m_phConnectSocket,
&olOverlap,
&dwTranferBytes,
TRUE,
&dwFlags);
if(FALSE == bRet || 0 == dwTranferBytes)
{
//delete [] pDataBuf.buf;
//pDataBuf.buf = NULL;
delete [] pDataBufRev.buf;
pDataBufRev.buf = NULL;
nErrorCode = WSAGetLastError();
return FALSE;
}
if(pDataBuf.len != dwTranferBytes)
{
ASSERT(0);
AfxMessageBox("Do not send all the data ");
}
else
{
// receive ACK
dwRecvdBytes = 0;
WSAOVERLAPPED olOverlapRev;
memset(&olOverlapRev, 0, sizeof(olOverlapRev));
WSAEVENT RevConnectEvent = WSACreateEvent();
olOverlapRev.hEvent = RevConnectEvent;
HANDLE pEventRev[HMSOCKET_EVTCOUNT] = {m_hTerminateEvent, RevConnectEvent};
nRet = WSARecv(m_phConnectSocket, &pDataBufRev, 1, &dwRecvdBytes,/* &dwFlags*/&dwFlagRev, &olOverlapRev, NULL);
if ( (nRet == SOCKET_ERROR) && (WSA_IO_PENDING != (nErrorCode = WSAGetLastError())))
{
delete [] pDataBufRev.buf;
pDataBufRev.buf = NULL;
nErrorCode = WSAGetLastError();
return FALSE;
}
ret_Obj = WaitForMultipleObjects(HMSOCKET_EVTCOUNT, pEventRev, FALSE, /*INFINITE*/nWaitTime); //1000ms is too long?
if(WAIT_TIMEOUT == ret_Obj)
{
delete [] pDataBufRev.buf;
pDataBufRev.buf = NULL;
return FALSE;
}
// shut the thread
if(WAIT_OBJECT_0 + HMTERMINATE_EVT == ret_Obj)
{
delete [] pDataBufRev.buf;
pDataBufRev.buf = NULL;
return FALSE;
}
if(WAIT_OBJECT_0 + HMSOCKET_SOCKEVT == ret_Obj)
{
WSAResetEvent(RevConnectEvent);
bRet = WSAGetOverlappedResult(m_phConnectSocket,
&olOverlapRev,
&dwTranferBytes,
TRUE,
/*&dwFlags*/&dwFlagRevRe);
if(FALSE == bRet || 0 == dwTranferBytes)
{
delete [] pDataBufRev.buf;
pDataBufRev.buf = NULL;
nErrorCode = WSAGetLastError();
return FALSE;
}
m_nReceiveLength = dwTranferBytes;
memcpy(m_chReceivebuf,pDataBufRev.buf,dwTranferBytes);
}
WSACloseEvent(RevConnectEvent);
}
}
delete [] pDataBufRev.buf;
pDataBufRev.buf = NULL;
return TRUE;
}
uj5u.com熱心網友回復:
upupupuj5u.com熱心網友回復:
檢查是否資源泄漏的辦法之一:在任務管理器 行程 查看 選擇列 里面選擇:記憶體使用、虛擬記憶體大小、句柄數、執行緒數、USER物件、GDI物件
讓你的程式(行程)不退出,回圈執行主流程很多遍,越多越好,比如1000000次甚至無限回圈,記錄以上各數值,再隔至少一小時,越長越好,比如一個月,再記錄以上各數值。如果以上兩組數值的差較大或隨時間流逝不斷增加,則鐵定有對應資源的資源泄漏!
搜“GDI泄露檢測”
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/156010.html
標籤:網絡編程
上一篇:求幫助理解,MFC繪曲線圖
