You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1028 lines
27 KiB
C++

2 years ago
/************************************************************************************
*
* 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><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><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><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><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><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;
}
}
}