when the recv function in client return WSAECONNRESET error,I try connect the server again.But it always failed.Who
can help me solve the error of WSAECONNRESET in client.Thanks
ULONG CMsgMutualTcp::receiveMsg(CMsgData &stMsgData)
{
LONG lRecvLen = -1;
ULONG ulRet = ERR_COMMON_FAIL;
if (BOOL_FALSE == m_bTcpConEstablished)
{
ulRet = createTcpConnect();
switch (ulRet)
{
case ERR_COMMON_SUCCEED:
{
m_bTcpConEstablished = BOOL_TRUE;
m_bReBldSocketStatus = BOOL_FALSE;
setKeepLive();
return ERR_COMMON_SUCCEED;
}
case ERR_RECEIVE_MEDIA_TIMEOUT:
{
return ERR_RECEIVE_MEDIA_TIMEOUT;
}
default:
{
FRAME_writeLog("CMsgMutualTcp::receiveMsg",__LINE__,"failed to create tcp connect.\n");
return ERR_COMMON_FAIL;
}
}
}
if (0 == m_ulKeepLiveTimerID)
{
FRAME_writeLog("CMsgMutualTcp::receiveMsg",__LINE__," start sending msg pkt timer.\n");
m_stLiveMsg.stMsgHdr.usMessageFlag = MSG_VMP_DATA_HEAD_FLAG;
m_stLiveMsg.stMsgHdr.ucVersion = 2; m_stLiveMsg.stMsgHdr.ucSubVersion = 0; m_stLiveMsg.stMsgHdr.ucType = 0; m_stLiveMsg.stMsgHdr.usCommand = VMP_MSG_USER_KEEPLIVE; m_stLiveMsg.stMsgHdr.usStatus = 0; m_stLiveMsg.stMsgHdr.ulSeqNum = sequencePlus(); m_stLiveMsg.stMsgHdr.ulSrcModId = 0; m_stLiveMsg.stMsgHdr.ulDstModId = 0; m_stLiveMsg.stMsgHdr.ulFromHandle = 0; m_stLiveMsg.stMsgHdr.ulToHandle = 0; m_stLiveMsg.stMsgHdr.ulContentLength = sizeof(IE_USER_LOG_INFO_S); m_stLiveMsg.stMsgHdr.ucFeature = 0; m_stLiveMsg.stUserLogInfo.stIEHdr.usIEID = IE_USER_LOG_INFO;
m_stLiveMsg.stUserLogInfo.stIEHdr.usIEBodyLen = sizeof(IE_USER_LOG_INFO_S) - sizeof(VMP_IE_HEADER_S);
strncpy(m_stLiveMsg.stUserLogInfo.szUserName, m_strUserName.c_str(), (sizeof(m_stLiveMsg.stUserLogInfo.szUserName) - 1));
m_stLiveMsg.stUserLogInfo.ulUserLoginHandle = m_ulLoginID;
m_stLiveMsg.stUserLogInfo.stUserLoginIP.usDomainType = MSG_AF_INET;
m_stLiveMsg.stUserLogInfo.stUserLoginIP.ulIpv4Addr = m_ulLocalIP;
m_stTimerParam.hSocket = m_hSocket;
m_stTimerParam.ulDstIP = m_ulSrcIP;
m_stTimerParam.usDstPort = m_usSrcPort;
sendKeepLivePktCallback(this);
m_ulKeepLiveTimerID = UWARE_XP_StartIndependTimer(OCX_KEEPLIVE_PACKET_SEND_INTERVAL,
sendKeepLivePktCallback,
this);
if (0 == m_ulKeepLiveTimerID)
{
m_ucLiveFailCount = MSG_LIVE_FAIL_COUNT;
FRAME_writeLog("CMsgMutualTcp::receiveMsg",__LINE__," startIndependTimer return error.\n");
return ERR_COMMON_FAIL;
}
sendBookNotifyPkt();
}
if (OCX_INVALID_HANDLE == m_hSocket)
{
FRAME_writeLog("CMsgMutualTcp::receiveMsg",__LINE__,"invalid handle of socket\n");
return ERR_COMMON_INVALID_PARAM;
}
OCX_POLLFD_S stPollFD = {0};
stPollFD.lFd = (LONG) m_hSocket;
stPollFD.usEvents = POLLIN;
stPollFD.usRevents = 0;
LONG lRet = OCX_poll(&stPollFD, 1, OCX_NETSTREAM_TIMEOUT_MAX);
if (0 == lRet)
{
if (0 == g_tick)
{
g_tick = GetTickCount();
}
else
{
if (GetTickCount() - g_tick > 30000)
{
ulRet = retryConnectServer();
if ( ERR_COMMON_SUCCEED == ulRet)
{
g_tick = 0;
m_bConnenctStatus = BOOL_TRUE;
FRAME_writeLog("CMsgMutualTcp::sendKeepLivePktCallback",__LINE__,"The RetryConnect has succeeded.\n");
}
else
{
m_bConnenctStatus = BOOL_FALSE;
}
}
}
return ERR_COMMON_FAIL;
}
else if (0 > lRet)
{
FRAME_writeLog("CMsgMutualTcp::receiveMsg",__LINE__,"poll failed, system errcode is %ld, handled as time out.\n", GetLastError());
(VOID)Sleep(OCX_NETSTREAM_TIMEOUT_MAX);
return ERR_COMMON_FAIL;
}
g_tick = 0;
m_stRecvAddr.sin_family = AF_INET;
m_stRecvAddr.sin_addr.s_addr = m_ulSrcIP;
m_stRecvAddr.sin_port = m_usSrcPort;
lRecvLen = recv(m_hSocket, (CHAR *)stMsgData.aucBuffer, stMsgData.lDataLength, 0);
if (0 == lRecvLen)
{
FRAME_writeLog("CMsgMutualTcp::receiveMsg",__LINE__,"Client connecttion closed");
return ERR_COMMON_FAIL;
}
else if(SOCKET_ERROR == lRecvLen)
{
DWORD errCode = GetLastError();
FRAME_writeLog("CMsgMutualTcp::receiveMsg",__LINE__,"recv is fail %ld\n", errCode);
ULONG retryStatus = retryConnectServer();
if ( ERR_COMMON_SUCCEED == retryStatus)
{
Sleep(10);
m_bConnenctStatus = BOOL_TRUE;
FRAME_writeLog("CMsgMutualTcp::sendKeepLivePktCallback",__LINE__,"The RetryConnect has succeeded.\n");
}
else
{
m_bConnenctStatus = BOOL_FALSE;
FRAME_writeLog("CMsgMutualTcp::sendKeepLivePktCallback",__LINE__,"The RetryConnect has failed.\n");
}
return ERR_COMMON_FAIL;
}
else
{
stMsgData.lDataLength = lRecvLen;
}
return ERR_COMMON_SUCCEED;
}