|
|
|
|
/************************************************************************************
|
|
|
|
|
*
|
|
|
|
|
* Copyright (C) 2002-2003 SCADA Control Technology Co., Ltd. All rights reserved.
|
|
|
|
|
*
|
|
|
|
|
* $Source: /opt/CVS_ROOT_PGC_EX2000/commserver/windows/widgets/udpping.cpp,v $
|
|
|
|
|
*
|
|
|
|
|
* $Author: zhuzhenhua $
|
|
|
|
|
*
|
|
|
|
|
* $Date: 2006/08/07 03:16:49 $
|
|
|
|
|
*
|
|
|
|
|
* $Revision: 1.2 $
|
|
|
|
|
*
|
|
|
|
|
* $State: Exp $
|
|
|
|
|
*
|
|
|
|
|
* $Name: $
|
|
|
|
|
*
|
|
|
|
|
* $Locker: $
|
|
|
|
|
*
|
|
|
|
|
**************************************************************************************/
|
|
|
|
|
//***************************************************************
|
|
|
|
|
//* udpping.cpp *
|
|
|
|
|
//* Liangchu Lee 1999.12.20 *
|
|
|
|
|
//***************************************************************
|
|
|
|
|
//************************<2A><> <20><> <20><> ʾ****************************
|
|
|
|
|
//1. wen 2002.11.11 ǰ<>û<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>û<EFBFBD>Bʱ<42><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD>
|
|
|
|
|
// <20><><EFBFBD>⣺<EFBFBD><E2A3BA>ǰ<EFBFBD>û<EFBFBD>AΪ<41><CEAA><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD>˳<EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>
|
|
|
|
|
// Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<DEB8>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UdpPingReaddata(void)<29><>
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ղ<EFBFBD><D5B2><EFBFBD><EFBFBD>Է<EFBFBD>PING<4E><47><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD>־ΪFALSE<53><45>
|
|
|
|
|
//2. wen 2003.04.21 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>һ̨<D2BB><CCA8><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ְ<EFBFBD><D6B0><EFBFBD>ʧ<EFBFBD>ܡ<EFBFBD>
|
|
|
|
|
// <20><><EFBFBD>⣺ǰ<E2A3BA>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ping<6E><67><EFBFBD>ն˿ڲ<CBBF><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>һ̨<D2BB><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>
|
|
|
|
|
// <20><>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>á<EFBFBD><C3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ=10048(<28><EFBFBD><D7BD>ֵ<EFBFBD>ַ<EFBFBD><D6B7>ʹ<EFBFBD><CAB9>)<29><>
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>socket<65><74><EFBFBD><EFBFBD>ΪSO_REUSEADDR<44><52><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>á<EFBFBD>
|
|
|
|
|
//***************************************************************
|
|
|
|
|
#include "commport.h"
|
|
|
|
|
#include "udpping.h"
|
|
|
|
|
#include "tcphost.h"
|
|
|
|
|
|
|
|
|
|
UDP_PING_INFO UdpPing;
|
|
|
|
|
|
|
|
|
|
int gUdpPingReadPort;
|
|
|
|
|
int gUdpPingWritePort;
|
|
|
|
|
|
|
|
|
|
int gUdpPingInitOk = FALSE;
|
|
|
|
|
|
|
|
|
|
int gPingWaitCnt = 0;
|
|
|
|
|
int gSendTxdDataFendIdx = 0;
|
|
|
|
|
|
|
|
|
|
//int gtestread = 1;
|
|
|
|
|
extern char IniFilePath[256];
|
|
|
|
|
|
|
|
|
|
void UdpPingTimer(void)
|
|
|
|
|
{
|
|
|
|
|
if(gUdpPingInitOk == TRUE)
|
|
|
|
|
{
|
|
|
|
|
UdpPingReaddata();
|
|
|
|
|
#ifdef MACRO_NETPING_P2P
|
|
|
|
|
UdpPingSendDataP2P();
|
|
|
|
|
#else
|
|
|
|
|
UdpPingSendData();
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
gUdpPingInitOk = UdpPingInit();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL UdpPingInit(void)
|
|
|
|
|
{
|
|
|
|
|
static BOOL bFirst = TRUE;
|
|
|
|
|
int i, tmp_len;
|
|
|
|
|
struct sockaddr_in *cliaddr;
|
|
|
|
|
//struct hostent *test;
|
|
|
|
|
#ifndef MACRO_NETPING_P2P
|
|
|
|
|
BOOL bBroadcast = TRUE; // <20>Ƿ<EFBFBD><C7B7>㲥<EFBFBD><E3B2A5>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD>
|
|
|
|
|
#endif
|
|
|
|
|
int timeout = 1000; // <20><>ʱ
|
|
|
|
|
|
|
|
|
|
char szConfig[256];
|
|
|
|
|
|
|
|
|
|
#ifdef OS_LINUX
|
|
|
|
|
strcpy(szConfig, "config.ini");
|
|
|
|
|
#else
|
|
|
|
|
//GetCurrentDirectory(sizeof(szDir), szDir);
|
|
|
|
|
sprintf(szConfig, "%s/config.ini", IniFilePath);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
gUdpPingReadPort = GetPrivateProInt("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "PING<EFBFBD><EFBFBD><EFBFBD>ն˿<EFBFBD>", 8124, szConfig);
|
|
|
|
|
gUdpPingWritePort = GetPrivateProInt("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "PING<EFBFBD><EFBFBD><EFBFBD>Ͷ˿<EFBFBD>", 8123, szConfig);
|
|
|
|
|
|
|
|
|
|
//test = gethostbyname(pFendMsg->Name);
|
|
|
|
|
for(i = 0; i < MAX_ADDR; i++)
|
|
|
|
|
{
|
|
|
|
|
if(bFirst == TRUE)
|
|
|
|
|
{
|
|
|
|
|
UdpPing.sSocket[i] = INVALID_SOCKET;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if(INVALID_SOCKET != UdpPing.sSocket[i])
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cliaddr = &UdpPing.CliAddr;
|
|
|
|
|
|
|
|
|
|
UdpPing.sSocket[i] = socket(AF_INET, SOCK_DGRAM, 0);
|
|
|
|
|
if(UdpPing.sSocket[i] < 0)
|
|
|
|
|
{
|
|
|
|
|
UdpPing.sSocket[i] = INVALID_SOCKET;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef OS_LINUX
|
|
|
|
|
// wen 2005.07.08 <20><>socket<65><74><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
|
|
|
|
|
tmp = fcntl(UdpPing.sSocket[i], F_GETFL, 0);
|
|
|
|
|
fcntl(UdpPing.sSocket[i], F_SETFL, tmp|O_NONBLOCK);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef MACRO_NETPING_P2P
|
|
|
|
|
// wen 2006.04.28 <20><>ʹ<EFBFBD>ù㲥<C3B9><E3B2A5><EFBFBD><EFBFBD>ping<6E><67>
|
|
|
|
|
bBroadcast = TRUE;
|
|
|
|
|
setsockopt(UdpPing.sSocket[i], SOL_SOCKET, SO_BROADCAST, (char*)&bBroadcast, sizeof(bBroadcast));
|
|
|
|
|
#endif
|
|
|
|
|
tmp_len = 1;
|
|
|
|
|
setsockopt(UdpPing.sSocket[i], SOL_SOCKET, SO_REUSEADDR, (char*)&tmp_len, sizeof(int));
|
|
|
|
|
setsockopt(UdpPing.sSocket[i], SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout));
|
|
|
|
|
setsockopt(UdpPing.sSocket[i], SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));
|
|
|
|
|
|
|
|
|
|
memset((char *)cliaddr, 0, sizeof(*cliaddr));
|
|
|
|
|
cliaddr->sin_family = AF_INET;
|
|
|
|
|
cliaddr->sin_addr.s_addr = htonl(INADDR_ANY);
|
|
|
|
|
cliaddr->sin_port = htons(INADDR_ANY);
|
|
|
|
|
if(bind(UdpPing.sSocket[i], (struct sockaddr *)cliaddr, sizeof(*cliaddr)) != 0)
|
|
|
|
|
//if((tmp = bind(UdpPing.sSocket[i], (struct sockaddr *)cliaddr, sizeof(*cliaddr))) == SOCKET_ERROR)
|
|
|
|
|
{
|
|
|
|
|
CloseNetSocket(UdpPing.sSocket[i]);
|
|
|
|
|
UdpPing.sSocket[i] = INVALID_SOCKET;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cliaddr = &UdpPing.CliAddr;
|
|
|
|
|
|
|
|
|
|
if(bFirst != TRUE)
|
|
|
|
|
{
|
|
|
|
|
if(INVALID_SOCKET != UdpPing.rSocket)
|
|
|
|
|
{
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
bFirst = FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
UdpPing.rSocket = socket(AF_INET, SOCK_DGRAM, 0);
|
|
|
|
|
if(UdpPing.rSocket < 0)
|
|
|
|
|
{
|
|
|
|
|
UdpPing.rSocket = INVALID_SOCKET;
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// wen 2003.04.21 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>һ̨<D2BB><CCA8><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ְ<EFBFBD><D6B0><EFBFBD>ʧ<EFBFBD>ܡ<EFBFBD><DCA1><EFBFBD><D7BD>ֵ<EFBFBD>ַ<EFBFBD><D6B7>ʹ<EFBFBD><CAB9>
|
|
|
|
|
tmp_len = 1;
|
|
|
|
|
setsockopt(UdpPing.rSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&tmp_len, sizeof(int));
|
|
|
|
|
|
|
|
|
|
memset((char *)cliaddr, 0, sizeof(*cliaddr));
|
|
|
|
|
cliaddr->sin_family = AF_INET;
|
|
|
|
|
cliaddr->sin_addr.s_addr = htonl(INADDR_ANY);
|
|
|
|
|
cliaddr->sin_port = htons(gUdpPingReadPort);
|
|
|
|
|
if(bind(UdpPing.rSocket, (struct sockaddr *)cliaddr, sizeof(*cliaddr)) != 0)
|
|
|
|
|
//if((tmp = bind(UdpPing.rSocket, (struct sockaddr *)cliaddr, sizeof(*cliaddr))) == SOCKET_ERROR)
|
|
|
|
|
{
|
|
|
|
|
CloseNetSocket(UdpPing.rSocket);
|
|
|
|
|
UdpPing.rSocket = INVALID_SOCKET;
|
|
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void UdpPingSendData(void)
|
|
|
|
|
{
|
|
|
|
|
//char szDbg[256];
|
|
|
|
|
static int cnt = 0;
|
|
|
|
|
int i, sendlen;
|
|
|
|
|
struct sockaddr_in *servaddr;
|
|
|
|
|
PINGINFORMATION PingData;
|
|
|
|
|
// wen 2002.07.11
|
|
|
|
|
BOOL bSendFlag = FALSE;
|
|
|
|
|
TCP_LINK_DEF *pHostLink;
|
|
|
|
|
FEND_DEF *pFendMsg;
|
|
|
|
|
SIO_PARAM_DEF *pSioParam;
|
|
|
|
|
|
|
|
|
|
cnt++;
|
|
|
|
|
if((cnt * TIMER_CNT) < 1000)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
cnt = 0;
|
|
|
|
|
|
|
|
|
|
// <20><>ȡȫ<C8A1>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
pHostLink = GetHostLinkPtr();
|
|
|
|
|
pFendMsg = GetFendMsgPtr();
|
|
|
|
|
|
|
|
|
|
//if(pFendMsg->SendTxdDataFlag[pFendMsg->FendIdx] == TRUE)
|
|
|
|
|
//{
|
|
|
|
|
// sprintf(szDbg, "FendIdx=%d is Txd Fend.", pFendMsg->FendIdx);
|
|
|
|
|
// DebugPrint(szDbg);
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
memmove((char*)PingData.barrRandom, PINGRANDOM, MAX_RANDOM);
|
|
|
|
|
if(pFendMsg->FendIdx == 0)
|
|
|
|
|
{
|
|
|
|
|
strcpy((char*)PingData.szNodeName, "FENDA");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
strcpy((char*)PingData.szNodeName, "FENDB");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PingData.bNodeType = FEND_TYPE;
|
|
|
|
|
PingData.wNodeID = pFendMsg->FendIdx;
|
|
|
|
|
PingData.inetMask = pFendMsg->HostIpAddr[0];
|
|
|
|
|
PingData.inetAddr = pFendMsg->AllIpAddr[0];
|
|
|
|
|
PingData.dwStatus = 0;
|
|
|
|
|
|
|
|
|
|
if(gPingWaitCnt < MAX_DELAYTIME)
|
|
|
|
|
{
|
|
|
|
|
gPingWaitCnt++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//sprintf(szDbg, "WaitCnt=%d, Txd[0]=%d, Txd[1]=%d, Exist[0]=%d, Exist[1]=%d",
|
|
|
|
|
// gPingWaitCnt, pFendMsg->SendTxdDataFlag[0], pFendMsg->SendTxdDataFlag[1],
|
|
|
|
|
// pFendMsg->FendExistFlag[0], pFendMsg->FendExistFlag[1]);
|
|
|
|
|
//DebugPrint(szDbg);
|
|
|
|
|
|
|
|
|
|
if(gPingWaitCnt == 5)
|
|
|
|
|
{
|
|
|
|
|
if((pFendMsg->SendTxdDataFlag[0] == 0)
|
|
|
|
|
&& (pFendMsg->SendTxdDataFlag[1] == 0))
|
|
|
|
|
{
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
|
|
// wen 2006.04.22 <20><><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>жϵĶ˿<C4B6>ͨѶ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>)
|
|
|
|
|
//pFendMsg->SendTxdDataFlag[0] = FALSE;
|
|
|
|
|
//pFendMsg->SendTxdDataFlag[1] = FALSE;
|
|
|
|
|
//pFendMsg->SendTxdDataFlag[pFendMsg->FendIdx] = TRUE;
|
|
|
|
|
//=======================================================================
|
|
|
|
|
if(pFendMsg->iPortMask)
|
|
|
|
|
{
|
|
|
|
|
pSioParam = GetSioParamPtr();
|
|
|
|
|
for(i=0; i<DEFAULT_MAX_PORT_NUM; i++)
|
|
|
|
|
{
|
|
|
|
|
if(pFendMsg->iPortMask & (0x00000001 << i))
|
|
|
|
|
{
|
|
|
|
|
if(pSioParam[i].Status)
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
i = DEFAULT_MAX_PORT_NUM;
|
|
|
|
|
}
|
|
|
|
|
if(i >= DEFAULT_MAX_PORT_NUM)
|
|
|
|
|
{
|
|
|
|
|
pFendMsg->SendTxdDataFlag[0] = FALSE;
|
|
|
|
|
pFendMsg->SendTxdDataFlag[1] = FALSE;
|
|
|
|
|
pFendMsg->SendTxdDataFlag[pFendMsg->FendIdx] = TRUE;
|
|
|
|
|
}
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if((gSendTxdDataFendIdx == 0) && (gPingWaitCnt > 10))
|
|
|
|
|
{
|
|
|
|
|
if((pFendMsg->SendTxdDataFlag[0] == 0)
|
|
|
|
|
&& (pFendMsg->SendTxdDataFlag[1] == 0))
|
|
|
|
|
{
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
|
|
// wen 2006.04.22 <20><><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>жϵĶ˿<C4B6>ͨѶ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>)
|
|
|
|
|
//pFendMsg->SendTxdDataFlag[0] = FALSE;
|
|
|
|
|
//pFendMsg->SendTxdDataFlag[1] = FALSE;
|
|
|
|
|
//pFendMsg->SendTxdDataFlag[pFendMsg->FendIdx] = TRUE;
|
|
|
|
|
//=======================================================================
|
|
|
|
|
if(pFendMsg->iPortMask)
|
|
|
|
|
{
|
|
|
|
|
pSioParam = GetSioParamPtr();
|
|
|
|
|
for(i=0; i<DEFAULT_MAX_PORT_NUM; i++)
|
|
|
|
|
{
|
|
|
|
|
if(pFendMsg->iPortMask & (0x00000001 << i))
|
|
|
|
|
{
|
|
|
|
|
if(pSioParam[i].Status)
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
i = DEFAULT_MAX_PORT_NUM;
|
|
|
|
|
}
|
|
|
|
|
if(i >= DEFAULT_MAX_PORT_NUM)
|
|
|
|
|
{
|
|
|
|
|
pFendMsg->SendTxdDataFlag[0] = FALSE;
|
|
|
|
|
pFendMsg->SendTxdDataFlag[1] = FALSE;
|
|
|
|
|
pFendMsg->SendTxdDataFlag[pFendMsg->FendIdx] = TRUE;
|
|
|
|
|
}
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(pFendMsg->FendExistFlag[0] == FALSE)
|
|
|
|
|
{
|
|
|
|
|
pFendMsg->SendTxdDataFlag[0] = FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(pFendMsg->FendExistFlag[1] == FALSE)
|
|
|
|
|
{
|
|
|
|
|
pFendMsg->SendTxdDataFlag[1] = FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// wen 2002.11.25 <20><><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD>ɹ<EFBFBD>
|
|
|
|
|
/*
|
|
|
|
|
switch(pFendMsg->LinkStatus[1]*2 + pFendMsg->LinkStatus[0])
|
|
|
|
|
{
|
|
|
|
|
case 0x01:
|
|
|
|
|
pFendMsg->SendTxdDataFlag[0] = TRUE;
|
|
|
|
|
pFendMsg->SendTxdDataFlag[1] = FALSE;
|
|
|
|
|
break;
|
|
|
|
|
case 0x02:
|
|
|
|
|
pFendMsg->SendTxdDataFlag[0] = FALSE;
|
|
|
|
|
pFendMsg->SendTxdDataFlag[1] = TRUE;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//DebugPrint("UdpPingSendData Begin...");
|
|
|
|
|
// <20>ֽ<EFBFBD>˳<EFBFBD><CBB3>ת<EFBFBD><D7AA>
|
|
|
|
|
PingData.wNodeID = SequenceHostToRtuWord(PingData.wNodeID);
|
|
|
|
|
for(i = 0; i < MAX_ADDR; i++)
|
|
|
|
|
{
|
|
|
|
|
if(INVALID_SOCKET == UdpPing.sSocket[i])
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PingData.inetMask = pFendMsg->HostIpAddr[i];
|
|
|
|
|
PingData.inetAddr = pFendMsg->AllIpAddr[i];
|
|
|
|
|
PingData.dwStatus = (pFendMsg->SendTxdDataFlag[pFendMsg->FendIdx] ? 4 : 0)
|
|
|
|
|
+ (pHostLink[1].InitOk ? 2 : 0) + (pHostLink[0].InitOk ? 1 : 0) + 0x30000;
|
|
|
|
|
|
|
|
|
|
switch(gSendTxdDataFendIdx)
|
|
|
|
|
{
|
|
|
|
|
case 1: // ǰ<>û<EFBFBD> A <20>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if(pFendMsg->SendTxdDataFlag[0] == 0)
|
|
|
|
|
{
|
|
|
|
|
pFendMsg->SendTxdDataFlag[1] = FALSE;
|
|
|
|
|
PingData.dwStatus += 0x10;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if(pFendMsg->SendTxdDataFlag[0]
|
|
|
|
|
&& pFendMsg->SendTxdDataFlag[1])
|
|
|
|
|
{
|
|
|
|
|
pFendMsg->SendTxdDataFlag[0] = TRUE;
|
|
|
|
|
pFendMsg->SendTxdDataFlag[1] = FALSE;
|
|
|
|
|
}
|
|
|
|
|
gSendTxdDataFendIdx = 0;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 2: // ǰ<>û<EFBFBD> B <20>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if(pFendMsg->SendTxdDataFlag[1] == 0)
|
|
|
|
|
{
|
|
|
|
|
pFendMsg->SendTxdDataFlag[0] = FALSE;
|
|
|
|
|
PingData.dwStatus += 0x20;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if(pFendMsg->SendTxdDataFlag[0]
|
|
|
|
|
&& pFendMsg->SendTxdDataFlag[1])
|
|
|
|
|
{
|
|
|
|
|
pFendMsg->SendTxdDataFlag[0] = TRUE;
|
|
|
|
|
pFendMsg->SendTxdDataFlag[1] = FALSE;
|
|
|
|
|
}
|
|
|
|
|
gSendTxdDataFendIdx = 0;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
servaddr = &UdpPing.SerAddr;
|
|
|
|
|
memset((char *)servaddr, 0, sizeof(struct sockaddr_in));
|
|
|
|
|
servaddr->sin_family = AF_INET;
|
|
|
|
|
servaddr->sin_addr.s_addr = htonl(pFendMsg->BroadCastAddr[i]);
|
|
|
|
|
if(0 == servaddr->sin_addr.s_addr)
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//sprintf(szDbg, "Txd[%d]=%d, wNodeId=%d, inetAddr=%08x, inetMask=%08x, dwStatus=%08x\n",
|
|
|
|
|
// pFendMsg->FendIdx, pFendMsg->SendTxdDataFlag[pFendMsg->FendIdx],
|
|
|
|
|
// PingData.wNodeID, PingData.inetAddr, PingData.inetMask, PingData.dwStatus);
|
|
|
|
|
//DebugPrint(szDbg);
|
|
|
|
|
|
|
|
|
|
// <20>ֽ<EFBFBD>˳<EFBFBD><CBB3>ת<EFBFBD><D7AA>
|
|
|
|
|
//PingData.wNodeID = SequenceHostToRtuWord(PingData.wNodeID);
|
|
|
|
|
PingData.inetMask = SequenceHostToRtuDWord(PingData.inetMask);
|
|
|
|
|
PingData.inetAddr = SequenceHostToRtuDWord(PingData.inetAddr);
|
|
|
|
|
PingData.dwStatus = SequenceHostToRtuDWord(PingData.dwStatus);
|
|
|
|
|
|
|
|
|
|
//sprintf(szDbg, "Send dwStatus(change)=%02x", PingData.dwStatus);
|
|
|
|
|
//DebugPrint(szDbg);
|
|
|
|
|
|
|
|
|
|
servaddr->sin_port = htons(gUdpPingWritePort);
|
|
|
|
|
sendlen = sendto(UdpPing.sSocket[i], (char*)&PingData, sizeof(PINGINFORMATION), 0,
|
|
|
|
|
(struct sockaddr *)servaddr, sizeof(struct sockaddr_in));
|
|
|
|
|
|
|
|
|
|
//sprintf(szDbg, "sendto([%d] %08x:%d) <ip=%08x>",
|
|
|
|
|
//i, pFendMsg->BroadCastAddr[i], gUdpPingWritePort, pFendMsg->HostIpAddr[i]);
|
|
|
|
|
//DebugPrint(szDbg);
|
|
|
|
|
|
|
|
|
|
servaddr->sin_port = htons(gUdpPingReadPort);
|
|
|
|
|
sendlen = sendto(UdpPing.sSocket[i], (char*)&PingData, sizeof(PINGINFORMATION), 0,
|
|
|
|
|
(struct sockaddr *)servaddr, sizeof(struct sockaddr_in));
|
|
|
|
|
|
|
|
|
|
//sprintf(szDbg, "sendto([%d] %08x:%d) <ip=%08x>\n",
|
|
|
|
|
//i, pFendMsg->BroadCastAddr[i], gUdpPingReadPort, pFendMsg->HostIpAddr[i]);
|
|
|
|
|
//DebugPrint(szDbg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//DebugPrint("UdpPingSendData End.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void UdpPingSendDataP2P(void)
|
|
|
|
|
{
|
|
|
|
|
//char szDbg[256];
|
|
|
|
|
static int cnt = 0;
|
|
|
|
|
int i, j, sendlen;
|
|
|
|
|
struct sockaddr_in *servaddr;
|
|
|
|
|
PINGINFORMATION PingData;
|
|
|
|
|
// wen 2002.07.11
|
|
|
|
|
BOOL bSendFlag = FALSE;
|
|
|
|
|
TCP_LINK_DEF *pHostLink;
|
|
|
|
|
FEND_DEF *pFendMsg;
|
|
|
|
|
SIO_PARAM_DEF *pSioParam;
|
|
|
|
|
|
|
|
|
|
cnt++;
|
|
|
|
|
if((cnt * TIMER_CNT) < 1000)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
cnt = 0;
|
|
|
|
|
|
|
|
|
|
// <20><>ȡȫ<C8A1>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
pHostLink = GetHostLinkPtr();
|
|
|
|
|
pFendMsg = GetFendMsgPtr();
|
|
|
|
|
|
|
|
|
|
//if(pFendMsg->SendTxdDataFlag[pFendMsg->FendIdx] == TRUE)
|
|
|
|
|
//{
|
|
|
|
|
// sprintf(szDbg, "FendIdx=%d is Txd Fend.", pFendMsg->FendIdx);
|
|
|
|
|
// DebugPrint(szDbg);
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
memmove((char*)PingData.barrRandom, PINGRANDOM, MAX_RANDOM);
|
|
|
|
|
if(pFendMsg->FendIdx == 0)
|
|
|
|
|
{
|
|
|
|
|
strcpy((char*)PingData.szNodeName, "FENDA");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
strcpy((char*)PingData.szNodeName, "FENDB");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PingData.bNodeType = FEND_TYPE;
|
|
|
|
|
PingData.wNodeID = pFendMsg->FendIdx;
|
|
|
|
|
PingData.inetMask = pFendMsg->HostIpAddr[0];
|
|
|
|
|
PingData.inetAddr = pFendMsg->AllIpAddr[0];
|
|
|
|
|
PingData.dwStatus = 0;
|
|
|
|
|
|
|
|
|
|
if(gPingWaitCnt < MAX_DELAYTIME)
|
|
|
|
|
{
|
|
|
|
|
gPingWaitCnt++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//sprintf(szDbg, "WaitCnt=%d, Txd[0]=%d, Txd[1]=%d, Exist[0]=%d, Exist[1]=%d",
|
|
|
|
|
// gPingWaitCnt, pFendMsg->SendTxdDataFlag[0], pFendMsg->SendTxdDataFlag[1],
|
|
|
|
|
// pFendMsg->FendExistFlag[0], pFendMsg->FendExistFlag[1]);
|
|
|
|
|
//DebugPrint(szDbg);
|
|
|
|
|
|
|
|
|
|
if(gPingWaitCnt == 5)
|
|
|
|
|
{
|
|
|
|
|
if((pFendMsg->SendTxdDataFlag[0] == 0)
|
|
|
|
|
&& (pFendMsg->SendTxdDataFlag[1] == 0))
|
|
|
|
|
{
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
|
|
// wen 2006.04.22 <20><><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>жϵĶ˿<C4B6>ͨѶ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>)
|
|
|
|
|
//pFendMsg->SendTxdDataFlag[0] = FALSE;
|
|
|
|
|
//pFendMsg->SendTxdDataFlag[1] = FALSE;
|
|
|
|
|
//pFendMsg->SendTxdDataFlag[pFendMsg->FendIdx] = TRUE;
|
|
|
|
|
//=======================================================================
|
|
|
|
|
if(pFendMsg->iPortMask)
|
|
|
|
|
{
|
|
|
|
|
pSioParam = GetSioParamPtr();
|
|
|
|
|
for(i=0; i<DEFAULT_MAX_PORT_NUM; i++)
|
|
|
|
|
{
|
|
|
|
|
if(pFendMsg->iPortMask & (0x00000001 << i))
|
|
|
|
|
{
|
|
|
|
|
if(pSioParam[i].Status)
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
i = DEFAULT_MAX_PORT_NUM;
|
|
|
|
|
}
|
|
|
|
|
if(i >= DEFAULT_MAX_PORT_NUM)
|
|
|
|
|
{
|
|
|
|
|
pFendMsg->SendTxdDataFlag[0] = FALSE;
|
|
|
|
|
pFendMsg->SendTxdDataFlag[1] = FALSE;
|
|
|
|
|
pFendMsg->SendTxdDataFlag[pFendMsg->FendIdx] = TRUE;
|
|
|
|
|
}
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if((gSendTxdDataFendIdx == 0) && (gPingWaitCnt > 10))
|
|
|
|
|
{
|
|
|
|
|
if((pFendMsg->SendTxdDataFlag[0] == 0)
|
|
|
|
|
&& (pFendMsg->SendTxdDataFlag[1] == 0))
|
|
|
|
|
{
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
|
|
// wen 2006.04.22 <20><><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>жϵĶ˿<C4B6>ͨѶ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>)
|
|
|
|
|
//pFendMsg->SendTxdDataFlag[0] = FALSE;
|
|
|
|
|
//pFendMsg->SendTxdDataFlag[1] = FALSE;
|
|
|
|
|
//pFendMsg->SendTxdDataFlag[pFendMsg->FendIdx] = TRUE;
|
|
|
|
|
//=======================================================================
|
|
|
|
|
if(pFendMsg->iPortMask)
|
|
|
|
|
{
|
|
|
|
|
pSioParam = GetSioParamPtr();
|
|
|
|
|
for(i=0; i<DEFAULT_MAX_PORT_NUM; i++)
|
|
|
|
|
{
|
|
|
|
|
if(pFendMsg->iPortMask & (0x00000001 << i))
|
|
|
|
|
{
|
|
|
|
|
if(pSioParam[i].Status)
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
i = DEFAULT_MAX_PORT_NUM;
|
|
|
|
|
}
|
|
|
|
|
if(i >= DEFAULT_MAX_PORT_NUM)
|
|
|
|
|
{
|
|
|
|
|
pFendMsg->SendTxdDataFlag[0] = FALSE;
|
|
|
|
|
pFendMsg->SendTxdDataFlag[1] = FALSE;
|
|
|
|
|
pFendMsg->SendTxdDataFlag[pFendMsg->FendIdx] = TRUE;
|
|
|
|
|
}
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// wen 2006.04.29 <20><>uclinux<75>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8>Լ<EFBFBD><D4BC><EFBFBD><DEB7><EFBFBD><EFBFBD>յĵ<D5B5><C4B5><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>Ϊ<EFBFBD>Լ<EFBFBD><D4BC>Ǵ<EFBFBD><C7B4>ڵġ<DAB5>
|
|
|
|
|
#ifdef OS_LINUX
|
|
|
|
|
pFendMsg->FendExistFlag[pFendMsg->FendIdx] = TRUE;
|
|
|
|
|
pFendMsg->FendExistCnt[pFendMsg->FendIdx] = 0;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
if(pFendMsg->FendExistFlag[0] == FALSE)
|
|
|
|
|
{
|
|
|
|
|
pFendMsg->SendTxdDataFlag[0] = FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(pFendMsg->FendExistFlag[1] == FALSE)
|
|
|
|
|
{
|
|
|
|
|
pFendMsg->SendTxdDataFlag[1] = FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// wen 2002.11.25 <20><><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD>ɹ<EFBFBD>
|
|
|
|
|
/*
|
|
|
|
|
switch(pFendMsg->LinkStatus[1]*2 + pFendMsg->LinkStatus[0])
|
|
|
|
|
{
|
|
|
|
|
case 0x01:
|
|
|
|
|
pFendMsg->SendTxdDataFlag[0] = TRUE;
|
|
|
|
|
pFendMsg->SendTxdDataFlag[1] = FALSE;
|
|
|
|
|
break;
|
|
|
|
|
case 0x02:
|
|
|
|
|
pFendMsg->SendTxdDataFlag[0] = FALSE;
|
|
|
|
|
pFendMsg->SendTxdDataFlag[1] = TRUE;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//DebugPrint("UdpPingSendDataP2P Begin...");
|
|
|
|
|
// <20>ֽ<EFBFBD>˳<EFBFBD><CBB3>ת<EFBFBD><D7AA>
|
|
|
|
|
PingData.wNodeID = SequenceHostToRtuWord(PingData.wNodeID);
|
|
|
|
|
for(i = 0; i < MAX_ADDR; i++)
|
|
|
|
|
{
|
|
|
|
|
if(INVALID_SOCKET == UdpPing.sSocket[i])
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PingData.inetMask = pFendMsg->HostIpAddr[i];
|
|
|
|
|
PingData.inetAddr = pFendMsg->AllIpAddr[i];
|
|
|
|
|
PingData.dwStatus = (pFendMsg->SendTxdDataFlag[pFendMsg->FendIdx] ? 4 : 0)
|
|
|
|
|
+ (pHostLink[1].InitOk ? 2 : 0) + (pHostLink[0].InitOk ? 1 : 0) + 0x30000;
|
|
|
|
|
|
|
|
|
|
switch(gSendTxdDataFendIdx)
|
|
|
|
|
{
|
|
|
|
|
case 1: // ǰ<>û<EFBFBD> A <20>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if(pFendMsg->SendTxdDataFlag[0] == 0)
|
|
|
|
|
{
|
|
|
|
|
pFendMsg->SendTxdDataFlag[1] = FALSE;
|
|
|
|
|
PingData.dwStatus += 0x10;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if(pFendMsg->SendTxdDataFlag[0]
|
|
|
|
|
&& pFendMsg->SendTxdDataFlag[1])
|
|
|
|
|
{
|
|
|
|
|
pFendMsg->SendTxdDataFlag[0] = TRUE;
|
|
|
|
|
pFendMsg->SendTxdDataFlag[1] = FALSE;
|
|
|
|
|
}
|
|
|
|
|
gSendTxdDataFendIdx = 0;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 2: // ǰ<>û<EFBFBD> B <20>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if(pFendMsg->SendTxdDataFlag[1] == 0)
|
|
|
|
|
{
|
|
|
|
|
pFendMsg->SendTxdDataFlag[0] = FALSE;
|
|
|
|
|
PingData.dwStatus += 0x20;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if(pFendMsg->SendTxdDataFlag[0]
|
|
|
|
|
&& pFendMsg->SendTxdDataFlag[1])
|
|
|
|
|
{
|
|
|
|
|
pFendMsg->SendTxdDataFlag[0] = TRUE;
|
|
|
|
|
pFendMsg->SendTxdDataFlag[1] = FALSE;
|
|
|
|
|
}
|
|
|
|
|
gSendTxdDataFendIdx = 0;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
servaddr = &UdpPing.SerAddr;
|
|
|
|
|
memset((char *)servaddr, 0, sizeof(struct sockaddr_in));
|
|
|
|
|
servaddr->sin_family = AF_INET;
|
|
|
|
|
//servaddr->sin_addr.s_addr = htonl(pFendMsg->SetTcpIpAddr[2*i]);
|
|
|
|
|
// <20>ֽ<EFBFBD>˳<EFBFBD><CBB3>ת<EFBFBD><D7AA>
|
|
|
|
|
//PingData.wNodeID = SequenceHostToRtuWord(PingData.wNodeID);
|
|
|
|
|
PingData.inetMask = SequenceHostToRtuDWord(PingData.inetMask);
|
|
|
|
|
PingData.inetAddr = SequenceHostToRtuDWord(PingData.inetAddr);
|
|
|
|
|
PingData.dwStatus = SequenceHostToRtuDWord(PingData.dwStatus);
|
|
|
|
|
// <20><><EFBFBD>Ե㷢<D4B5><EFBFBD>ǰ<EFBFBD>û<EFBFBD>
|
|
|
|
|
for(j=0; j<MAX_FEND; j++)
|
|
|
|
|
{
|
|
|
|
|
// wen 2006.04.29 <20><>uclinux<75>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8>Լ<EFBFBD><D4BC><EFBFBD><DEB7><EFBFBD><EFBFBD>յĵ<D5B5><C4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8>Լ<EFBFBD><D4BC><EFBFBD>
|
|
|
|
|
#ifdef OS_LINUX
|
|
|
|
|
if(j == pFendMsg->FendIdx)
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
if(strlen(pFendMsg->SetTcpIpAddr[MAX_FEND*j+i]) > 0)
|
|
|
|
|
{
|
|
|
|
|
//sprintf(szDbg, "FEND_%d: Txd[%d]=%d, wNodeId=%d, inetAddr=%08x, inetMask=%08x, dwStatus=%08x\n",
|
|
|
|
|
// j+1, pFendMsg->FendIdx, pFendMsg->SendTxdDataFlag[pFendMsg->FendIdx],
|
|
|
|
|
// PingData.wNodeID, PingData.inetAddr, PingData.inetMask, PingData.dwStatus);
|
|
|
|
|
//DebugPrint(szDbg);
|
|
|
|
|
|
|
|
|
|
//sprintf(szDbg, "Send dwStatus(change)=%02x", PingData.dwStatus);
|
|
|
|
|
//DebugPrint(szDbg);
|
|
|
|
|
|
|
|
|
|
servaddr->sin_addr.s_addr = inet_addr((char *)pFendMsg->SetTcpIpAddr[MAX_FEND*j+i]);
|
|
|
|
|
|
|
|
|
|
//DebugPrint((char *)pFendMsg->SetTcpIpAddr[MAX_FEND*j+i]);
|
|
|
|
|
|
|
|
|
|
servaddr->sin_port = htons(gUdpPingReadPort);
|
|
|
|
|
sendlen = sendto(UdpPing.sSocket[i], (char*)&PingData, sizeof(PINGINFORMATION), 0,
|
|
|
|
|
(struct sockaddr *)servaddr, sizeof(struct sockaddr_in));
|
|
|
|
|
|
|
|
|
|
//sprintf(szDbg, "sendto([%d] %08x:%d) <ip=%08x>\n",
|
|
|
|
|
//i, pFendMsg->BroadCastAddr[i], gUdpPingReadPort, pFendMsg->HostIpAddr[i]);
|
|
|
|
|
//DebugPrint(szDbg);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>Ե㷢<D4B5><EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
for(j=0; j<MAX_HOST; j++)
|
|
|
|
|
{
|
|
|
|
|
if(strlen((char *)pHostLink[j].TcpIpAddr[i]) > 0)
|
|
|
|
|
{
|
|
|
|
|
//sprintf(szDbg, "HOST_%d: Txd[%d]=%d, wNodeId=%d, inetAddr=%08x, inetMask=%08x, dwStatus=%08x\n",
|
|
|
|
|
// j+1, pFendMsg->FendIdx, pFendMsg->SendTxdDataFlag[pFendMsg->FendIdx],
|
|
|
|
|
// PingData.wNodeID, PingData.inetAddr, PingData.inetMask, PingData.dwStatus);
|
|
|
|
|
//DebugPrint(szDbg);
|
|
|
|
|
|
|
|
|
|
servaddr->sin_addr.s_addr = inet_addr((char *)pHostLink[j].TcpIpAddr[i]);
|
|
|
|
|
servaddr->sin_port = htons(gUdpPingWritePort);
|
|
|
|
|
sendlen = sendto(UdpPing.sSocket[i], (char*)&PingData, sizeof(PINGINFORMATION), 0,
|
|
|
|
|
(struct sockaddr *)servaddr, sizeof(struct sockaddr_in));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//DebugPrint("UdpPingSendDataP2P End.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void UdpPingReaddata(void)
|
|
|
|
|
{
|
|
|
|
|
fd_set set;
|
|
|
|
|
struct timeval outtime;
|
|
|
|
|
struct sockaddr_in src_servaddr;
|
|
|
|
|
int rlen, i, j, k;
|
|
|
|
|
short msglen;
|
|
|
|
|
u_char msgdata[MAX_RTU_MSG_SIZE];
|
|
|
|
|
PINGINFORMATION *pingmsg;
|
|
|
|
|
char revip[32];
|
|
|
|
|
char szbuf[128];
|
|
|
|
|
static int dflag = 0;
|
|
|
|
|
// wen 2002.11.11 ǰ<>û<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>û<EFBFBD>Bʱ<42><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>
|
|
|
|
|
static int recvtimeout = 0;
|
|
|
|
|
TCP_LINK_DEF *pHostLink;
|
|
|
|
|
FEND_DEF *pFendMsg;
|
|
|
|
|
SIO_PARAM_DEF *pSioParam;
|
|
|
|
|
|
|
|
|
|
// <20><>ȡȫ<C8A1>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
pHostLink = GetHostLinkPtr();
|
|
|
|
|
pFendMsg = GetFendMsgPtr();
|
|
|
|
|
//for(i = 0; i < MAX_ADDR; i++)
|
|
|
|
|
{
|
|
|
|
|
memset((char*)&outtime, 0, sizeof(struct timeval));
|
|
|
|
|
memset((char*)&src_servaddr, 0, sizeof(src_servaddr));
|
|
|
|
|
FD_ZERO(&set);
|
|
|
|
|
|
|
|
|
|
FD_SET(UdpPing.rSocket, &set);
|
|
|
|
|
|
|
|
|
|
if(UdpPing.rSocket == INVALID_SOCKET)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for(; ;)
|
|
|
|
|
{
|
|
|
|
|
rlen = select(UdpPing.rSocket+1, &set, NULL, NULL, &outtime);
|
|
|
|
|
if(rlen < 1)
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rlen = sizeof(struct sockaddr_in);
|
|
|
|
|
msglen = recvfrom(UdpPing.rSocket, (char*)msgdata, MAX_RTU_MSG_SIZE,
|
|
|
|
|
0, (struct sockaddr*)&src_servaddr, &rlen);
|
|
|
|
|
|
|
|
|
|
if(msglen == SOCKET_ERROR)
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for(j = 0; j < msglen; j += sizeof(PINGINFORMATION))
|
|
|
|
|
{
|
|
|
|
|
pingmsg = (PINGINFORMATION*)msgdata;
|
|
|
|
|
//if(!CmpnString((char*)pingmsg->barrRandom, PINGRANDOM, MAX_RANDOM-1))
|
|
|
|
|
// continue;
|
|
|
|
|
|
|
|
|
|
// <20>ֽ<EFBFBD>˳<EFBFBD><CBB3>ת<EFBFBD><D7AA>
|
|
|
|
|
pingmsg->wNodeID = SequenceRtuToHostWord(pingmsg->wNodeID);
|
|
|
|
|
pingmsg->inetAddr = SequenceRtuToHostDWord(pingmsg->inetAddr);
|
|
|
|
|
pingmsg->inetMask = SequenceRtuToHostDWord(pingmsg->inetMask);
|
|
|
|
|
pingmsg->dwStatus = SequenceRtuToHostDWord(pingmsg->dwStatus);
|
|
|
|
|
|
|
|
|
|
//sprintf(szbuf, "recv: wNodeId=%d, inetAddr=%08x, inetMask=%08x, dwStatus=%08x",
|
|
|
|
|
// pingmsg->wNodeID, pingmsg->inetAddr, pingmsg->inetMask, pingmsg->dwStatus);
|
|
|
|
|
//DebugPrint(szbuf);
|
|
|
|
|
|
|
|
|
|
switch(pingmsg->bNodeType)
|
|
|
|
|
{
|
|
|
|
|
case MMI_TYPE:
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case FEND_TYPE:
|
|
|
|
|
/* test
|
|
|
|
|
if(gtestread == 0)
|
|
|
|
|
{
|
|
|
|
|
// ǰ<>û<EFBFBD>a
|
|
|
|
|
if(pingmsg->wNodeID == 0)
|
|
|
|
|
{
|
|
|
|
|
DebugPrint("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>û<EFBFBD>a<EFBFBD><EFBFBD>ping<EFBFBD><EFBFBD>");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}*/
|
|
|
|
|
|
|
|
|
|
// wen 2002.11.11 ǰ<>û<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>û<EFBFBD>Bʱ<42><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>
|
|
|
|
|
// ÿһ<C3BF><D2BB>ping <20><> һ<><D2BB><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD>һ<EFBFBD><D2BB>
|
|
|
|
|
if(!pFendMsg->SendTxdDataFlag[pFendMsg->FendIdx])
|
|
|
|
|
{
|
|
|
|
|
if(recvtimeout < 6)
|
|
|
|
|
{
|
|
|
|
|
recvtimeout++;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
recvtimeout = 0;
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
|
|
// wen 2006.04.22 <20><><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>жϵĶ˿<C4B6>ͨѶ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>)
|
|
|
|
|
//pFendMsg->SendTxdDataFlag[(pFendMsg->FendIdx+1)%MAX_ADDR] = FALSE;
|
|
|
|
|
//pFendMsg->SendTxdDataFlag[pFendMsg->FendIdx] = TRUE;
|
|
|
|
|
//=======================================================================
|
|
|
|
|
if(pFendMsg->iPortMask)
|
|
|
|
|
{
|
|
|
|
|
pSioParam = GetSioParamPtr();
|
|
|
|
|
for(i=0; i<DEFAULT_MAX_PORT_NUM; i++)
|
|
|
|
|
{
|
|
|
|
|
if(pFendMsg->iPortMask & (0x00000001 << i))
|
|
|
|
|
{
|
|
|
|
|
if(pSioParam[i].Status)
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
i = DEFAULT_MAX_PORT_NUM;
|
|
|
|
|
}
|
|
|
|
|
if(i >= DEFAULT_MAX_PORT_NUM)
|
|
|
|
|
{
|
|
|
|
|
pFendMsg->SendTxdDataFlag[(pFendMsg->FendIdx+1)%MAX_ADDR] = FALSE;
|
|
|
|
|
pFendMsg->SendTxdDataFlag[pFendMsg->FendIdx] = TRUE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for(k = 0; k < MAX_FEND*MAX_ADDR; k++)
|
|
|
|
|
{
|
|
|
|
|
if((k / MAX_ADDR) == pFendMsg->FendIdx)
|
|
|
|
|
{
|
|
|
|
|
if(inet_addr((char*)pFendMsg->TcpIpAddr[k % MAX_ADDR]) != src_servaddr.sin_addr.s_addr)
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if(inet_addr((char*)pFendMsg->SetTcpIpAddr[k]) != src_servaddr.sin_addr.s_addr)
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// wen 2002.11.11 ǰ<>û<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>û<EFBFBD>Bʱ<42><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>
|
|
|
|
|
recvtimeout = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if((k / MAX_ADDR) != pingmsg->wNodeID)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
pFendMsg->FendExistFlag[pingmsg->wNodeID] = TRUE;
|
|
|
|
|
pFendMsg->FendExistCnt[pingmsg->wNodeID] = 0;
|
|
|
|
|
|
|
|
|
|
pFendMsg->LinkStatus[pingmsg->wNodeID] = (pingmsg->dwStatus & 0x03) ? 1 : 0;
|
|
|
|
|
if(pFendMsg->LinkStatus[pingmsg->wNodeID])
|
|
|
|
|
pFendMsg->LinkCnt[pingmsg->wNodeID] = 0;
|
|
|
|
|
|
|
|
|
|
pFendMsg->SendTxdDataFlag[pingmsg->wNodeID] = (pingmsg->dwStatus & 0x04) ? TRUE : FALSE;
|
|
|
|
|
switch(pingmsg->dwStatus & 0x30)
|
|
|
|
|
{
|
|
|
|
|
case 0x10:
|
|
|
|
|
pFendMsg->SendTxdDataFlag[0] = TRUE;
|
|
|
|
|
pFendMsg->SendTxdDataFlag[1] = FALSE;
|
|
|
|
|
break;
|
|
|
|
|
case 0x20:
|
|
|
|
|
pFendMsg->SendTxdDataFlag[0] = FALSE;
|
|
|
|
|
pFendMsg->SendTxdDataFlag[1] = TRUE;
|
|
|
|
|
break;
|
|
|
|
|
// wen 2002.04.05
|
|
|
|
|
default:
|
|
|
|
|
if(pFendMsg->SendTxdDataFlag[0] & pFendMsg->SendTxdDataFlag[1])
|
|
|
|
|
{
|
|
|
|
|
pFendMsg->SendTxdDataFlag[0] = TRUE;
|
|
|
|
|
pFendMsg->SendTxdDataFlag[1] = FALSE;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
// wen 2006.04.29 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EEA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ᷢ<EFBFBD><E1B7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
//if(pFendMsg->SendTxdDataFlag[0] && pFendMsg->SendTxdDataFlag[1])
|
|
|
|
|
//{
|
|
|
|
|
// pFendMsg->SendTxdDataFlag[1] = FALSE;
|
|
|
|
|
//}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case HOST_TYPE:
|
|
|
|
|
for(k = 0; k < MAX_HOST * MAX_ADDR; k++)
|
|
|
|
|
{
|
|
|
|
|
strcpy((char*)revip, inet_ntoa(*(struct in_addr*)&src_servaddr.sin_addr.s_addr));
|
|
|
|
|
if(inet_addr((char*)pHostLink[k / MAX_ADDR].TcpIpAddr[k % MAX_ADDR]) != src_servaddr.sin_addr.s_addr)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if((k / MAX_ADDR) != pingmsg->wNodeID)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
pHostLink[pingmsg->wNodeID].RevHostStatusMsg = TRUE;
|
|
|
|
|
pHostLink[pingmsg->wNodeID].VersionFalgByte = (u_char)(HIWORD(pingmsg->dwStatus) >> 8);
|
|
|
|
|
|
|
|
|
|
pHostLink[pingmsg->wNodeID].Status = (u_char)(LOWORD(pingmsg->dwStatus) - 1);
|
|
|
|
|
if(pHostLink[pingmsg->wNodeID].InitOk == TRUE)
|
|
|
|
|
pHostLink[pingmsg->wNodeID].StatusCnt = 0;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if((pHostLink[0].Status == 0) && (pHostLink[1].Status == 0))
|
|
|
|
|
{
|
|
|
|
|
if(dflag == 0)
|
|
|
|
|
{
|
|
|
|
|
sprintf(szbuf, "<EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬Ϊ˫<EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>!!! <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %c ״̬<D7B4><CCAC><EFBFBD><EFBFBD>", pingmsg->wNodeID + 'A');
|
|
|
|
|
DebugPrint((char*)szbuf);
|
|
|
|
|
}
|
|
|
|
|
dflag = 1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if(dflag)
|
|
|
|
|
{
|
|
|
|
|
if(pHostLink[0].Status == 0)
|
|
|
|
|
{
|
|
|
|
|
sprintf(szbuf, "<EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ A <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>!!!");
|
|
|
|
|
DebugPrint((char*)szbuf);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(pHostLink[1].Status == 0)
|
|
|
|
|
{
|
|
|
|
|
sprintf(szbuf, "<EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ B <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>!!!");
|
|
|
|
|
DebugPrint((char*)szbuf);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
dflag = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//sprintf(szbuf, "pHostLink[0].Status=%d, pHostLink[1].Status=%d\n",
|
|
|
|
|
// pHostLink[0].Status, pHostLink[1].Status);
|
|
|
|
|
//DebugPrint(szbuf);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void UdpPingClose(void)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
for(i = 0; i < MAX_ADDR; i++)
|
|
|
|
|
{
|
|
|
|
|
if(UdpPing.sSocket[i] == INVALID_SOCKET)
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
CloseNetSocket(UdpPing.sSocket[i]);
|
|
|
|
|
UdpPing.sSocket[i] = INVALID_SOCKET;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(UdpPing.rSocket != INVALID_SOCKET)
|
|
|
|
|
{
|
|
|
|
|
CloseNetSocket(UdpPing.rSocket);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
UdpPing.rSocket = INVALID_SOCKET;
|
|
|
|
|
gUdpPingInitOk = FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void UdpPingSwitch(void)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
FEND_DEF *pFendMsg;
|
|
|
|
|
|
|
|
|
|
// <20><>ȡȫ<C8A1>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
pFendMsg = GetFendMsgPtr();
|
|
|
|
|
|
|
|
|
|
for(i=0; i<MAX_FEND; i++)
|
|
|
|
|
{
|
|
|
|
|
pFendMsg->FendExistFlag[i] = FALSE;
|
|
|
|
|
pFendMsg->FendExistCnt[i] = 0;
|
|
|
|
|
pFendMsg->LinkStatus[i] = FALSE;
|
|
|
|
|
pFendMsg->LinkCnt[i] = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(pFendMsg->SendTxdDataFlag[pFendMsg->FendIdx] == TRUE)
|
|
|
|
|
{
|
|
|
|
|
pFendMsg->SendTxdDataFlag[pFendMsg->FendIdx] = FALSE;
|
|
|
|
|
|
|
|
|
|
if(pFendMsg->FendIdx == 0)
|
|
|
|
|
{
|
|
|
|
|
gSendTxdDataFendIdx = 2;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
gSendTxdDataFendIdx = 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if(pFendMsg->FendIdx == 0)
|
|
|
|
|
{
|
|
|
|
|
gSendTxdDataFendIdx = 1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
gSendTxdDataFendIdx = 2;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|