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.

963 lines
20 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

//#include "stdafx.h"
#include "udpcomm.h"
#include "commport.h"
#include "udpping.h"
#include "tcphost.h"
//#include "qt_public.h"
//#include <qapplication.h>
//#include "WidgetMainWnd.h"
extern FUNCTION_CALL *FunCallPtr;
extern SIO_PARAM_DEF SioParam[];
extern int CurPort;
extern int RealDataDispFlag;
extern char IniFilePath[256];
int giRealDataToFile = 1;
UDP_SET_DEF UdpParam;
HOST_IP_ADDR HostIpAddr;
int UdpParamInitFlag = 0;
int iDevNum = 0;
int iCurDevIdx = 0;
DEV_DEF DevParam[MAX_DEV_NUM];
int SendCnt = 0;
int RecvCnt = 0;
char gCurConfigFileName[512];
void InitGlobalMember()
{
memset(gCurConfigFileName, 0, sizeof(gCurConfigFileName));
}
void GetHostIpAddr(void)
{
int i;
WSADATA WSAData;
struct hostent *test;
struct in_addr *addr, inaddr;
char name[256];
memset((char*)&HostIpAddr, 0, sizeof(HOST_IP_ADDR));
if(WSAStartup(MAKEWORD(2, 1), (LPWSADATA)&WSAData) != 0)
return;
gethostname(name, 100);
test = gethostbyname(name);
test->h_addrtype = test->h_addrtype;
for (i = 0; i < MAX_NET_NUM; i++)
{
addr = (struct in_addr *)test->h_addr_list[i];
if(addr == NULL)
break;
inaddr = *((in_addr *)test->h_addr_list[i]);
HostIpAddr.AllIpAddr[i] = ntohl(inaddr.S_un.S_addr);
if(IN_CLASSA(HostIpAddr.AllIpAddr[i])) /*AÀàµØÖ·*/
{
HostIpAddr.NetMaskIpAddr[i] = IN_CLASSA_NET;
HostIpAddr.MainIpAddr[i] = (HostIpAddr.AllIpAddr[i] & IN_CLASSA_NET);
HostIpAddr.BroadCastIpAddr[i] = (HostIpAddr.AllIpAddr[i] & IN_CLASSA_NET) | IN_CLASSA_HOST;
}
else if(IN_CLASSB(HostIpAddr.AllIpAddr[i])) /*BÀàµØÖ·*/
{
HostIpAddr.NetMaskIpAddr[i] = IN_CLASSB_NET;
HostIpAddr.MainIpAddr[i] = (HostIpAddr.AllIpAddr[i] & IN_CLASSB_NET);
HostIpAddr.BroadCastIpAddr[i] = (HostIpAddr.AllIpAddr[i] & IN_CLASSB_NET) | IN_CLASSB_HOST;
}
else if(IN_CLASSC(HostIpAddr.AllIpAddr[i])) /*CÀàµØÖ·*/
{
HostIpAddr.NetMaskIpAddr[i] = IN_CLASSC_NET;
HostIpAddr.MainIpAddr[i] = (HostIpAddr.AllIpAddr[i] & IN_CLASSC_NET);
HostIpAddr.BroadCastIpAddr[i] = (HostIpAddr.AllIpAddr[i] & IN_CLASSC_NET) | IN_CLASSC_HOST;
}
}
}
//´´½¨ÓÃÓÚϵͳÅäÖõÄUDP socket
void CreatUdpSetSock(void)
{
int tmp;
char szConfig[256];
//GetCurrentDirectory(sizeof(szDir), szDir);
sprintf(szConfig, "%s/config.ini", IniFilePath);
if(UdpParamInitFlag == 0)
{
memset((char*)&UdpParam, 0, sizeof(UDP_SET_DEF));
UdpParam.PortNumber = GetPrivateProInt("NetCommPort", "UdpCommPort", 0, szConfig);
if(UdpParam.PortNumber == 0)
{
UdpParam.PortNumber = DEFAULT_UDP_COMM_PORT;
}
GetHostIpAddr();
UdpParamInitFlag = 1;
}
if(UdpParam.Socket)
return;
UdpParam.Socket = socket(AF_INET, SOCK_DGRAM, 0);
if(UdpParam.Socket <= 0)
{
UdpParam.Socket = 0;
return;
}
// wen 2005.12.01 ÔÚÕâÀï³õʼ»¯Êý¾Ý
InitGlobalMember();
//ÉèÖÃsocketÊäÈëÊä³öç·³å
tmp = MAX_NET_BUF_SIZE;
setsockopt(UdpParam.Socket, SOL_SOCKET, SO_RCVBUF, (char*)&tmp, sizeof(tmp));
tmp = MAX_NET_BUF_SIZE;
setsockopt(UdpParam.Socket, SOL_SOCKET, SO_SNDBUF, (char*)&tmp, sizeof(tmp));
tmp = 1;
setsockopt(UdpParam.Socket, SOL_SOCKET, SO_BROADCAST, (char*)&tmp, sizeof(tmp)); // ¹ã²¥
//ÈÃÅäÖÃsocket ÄÜÊÕ²»Í¬Íø¶ÎµÄÅäÖÃÃüÁî
memset(&UdpParam.Addr, 0, sizeof(UdpParam.Addr));
UdpParam.Addr.sin_family = AF_INET;
UdpParam.Addr.sin_port = htons(UdpParam.PortNumber);
// wen 2005.03.08 ÐÞ¸ÄipΪָ¶¨µÄµØÖ·
UdpParam.Addr.sin_addr.s_addr = htonl(INADDR_ANY);
//UdpParam.Addr.sin_addr.s_addr = inet_addr("192.168.1.200");
if(bind(UdpParam.Socket, (struct sockaddr *)&UdpParam.Addr, sizeof(UdpParam.Addr)) < 0)
{
// windows
//DWORD dwerror = GetLastError();
closesocket(UdpParam.Socket);
UdpParam.Socket = 0;
}
}
void CloseUdpSetSock(void)
{
if(UdpParam.Socket)
{
closesocket(UdpParam.Socket);
}
UdpParam.Socket = 0;
}
int CheckIsMySelftIpAddr(u_long addr)
{
int i;
for(i = 0; i < MAX_NET_NUM; i++)
{
if(addr == HostIpAddr.AllIpAddr[i])
{
return true;
}
}
// ¶¨ÒåǰÖûú¹¦ÄÜ
#ifdef FUNCTION_FEND
#if (FEND_OTHERDEV_DS3116 == 0)
// ·Çds-3116É豸ʱ£¬ÐèÒªÓÃËûÀ´È·¶¨ÊÇ·ñΪÁíÒ»¸öǰÖûú
return CheckIsFendIpAddr(addr);
#endif
#endif
return false;
}
int CheckIsCurDevIpAddr(u_long addr)
{
//int i;
//for(i = 0; i < MAX_NET_NUM; i++)
{
if(addr == DevParam[iCurDevIdx].CurCommIp)
{
return true;
}
}
return false;
}
//½ÓÊÕÍøÂçÅäÖÃÍøÂçÃüÁî
void SetUdpRecv(void)
{
struct timeval outtime;
int len;
int addr_len = sizeof(struct sockaddr_in);
fd_set set;
u_char recvbuf[MAX_NET_BUF_SIZE];
//char szDbg[128];
CreatUdpSetSock();
if(UdpParam.Socket == 0)
return;
memset((char*)&outtime, 0, sizeof(struct timeval));
memset((char*)&UdpParam.Addr, 0, sizeof(UdpParam.Addr));
FD_ZERO(&set);
FD_SET(UdpParam.Socket, &set);
for(; ;)
{
//Òì²½ÊÕ
if(select(FD_SETSIZE, &set, NULL, NULL, &outtime) < 1)
break;
len = recvfrom(UdpParam.Socket, (char*)recvbuf, MAX_NET_BUF_SIZE,0, (struct sockaddr *)&UdpParam.Addr, &addr_len) ;
if(len < 1)
break;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// wen 2005.09.28 Ôö¼Ó¶ÔudpͨѶ¶Ë¿ÚµÄÏÔʾ
if(RealDataDispFlag)
{
if((CurPort == GetMaxPort()) && (CheckIsCurDevIpAddr(ntohl(UdpParam.Addr.sin_addr.s_addr))))
{
RTUMSG *msg;
WORD wLen, wType;
BYTE *ptr;
msg = (RTUMSG *)recvbuf;
if(IsNetSequence() == TRUE)
{
wType = msg->MsgType;
wLen = msg->MsgLen;
}
else
{
ptr = (BYTE *)&msg->MsgType;
wType = ptr[0] * 256 + ptr[1];
ptr = (BYTE *)&msg->MsgLen;
wLen = ptr[0] * 256 + ptr[1];
}
WatchDataPutDispBuf(msg->PortIdx, SDS_SIO_RECV_DATA, msg->MsgData, wLen);
}
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(CheckIsMySelftIpAddr(ntohl(UdpParam.Addr.sin_addr.s_addr)) == false)
{
/*
if(UdpParam.Addr.sin_addr.S_un.S_addr != 0xd802a8c0)
{
sprintf(szDbg, "IP(recv): %d.%d.%d.%d:%d",
UdpParam.Addr.sin_addr.S_un.S_un_b.s_b1,
UdpParam.Addr.sin_addr.S_un.S_un_b.s_b2,
UdpParam.Addr.sin_addr.S_un.S_un_b.s_b3,
UdpParam.Addr.sin_addr.S_un.S_un_b.s_b4,
UdpParam.Addr.sin_port);
DebugPrint(szDbg);
}
*/
void SetUdpRecvDataProcess(u_long ipaddr, u_char *buf, int len);
SetUdpRecvDataProcess(ntohl(UdpParam.Addr.sin_addr.s_addr), recvbuf, len);
}
//else
//{
// DebugPrint("Recv self.");
//}
}
}
//·¢ËÍÅäÖÃÃüÁÒýÈëIPµØÖ·£¬¿ÉÒÔ×ÔÓɲÉÓõã¶Ôµã£¬È«Íø¹ã²¥·¢ËÍ·½Ê½
int SetUdpSend(u_long ipaddr, char *buf, int len)
{
struct sockaddr_in addr;
int slen;
if(UdpParam.Socket == 0)
{
return false;
}
// ¶¨ÒåǰÖûú¹¦ÄÜ
#ifdef FUNCTION_FEND
// wen 2005.10.12 Ôö¼ÓÊÇ·ñÏ·¢Ç°ÖûúµÄÅжÏ
#if (FEND_OTHERDEV_DS3116 == 0)
if(GetFendTxdFlag() == 0)
{
return false;
}
#endif
#endif
if(len == 0)
{
return false;
}
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(UdpParam.PortNumber);
addr.sin_addr.s_addr = ntohl(ipaddr);
slen = sendto(UdpParam.Socket, buf, len, 0,
(struct sockaddr *)&addr, sizeof(struct sockaddr_in));
if(slen != len)
{
closesocket(UdpParam.Socket);
UdpParam.Socket = 0;
return false;
}
else
{
RTUMSG *msg;
WORD wLen, wType;
BYTE *ptr;
wLen = 0x55AA;
ptr = (BYTE *)&wLen;
msg = (RTUMSG *)buf;
if(ptr[0] == 0x55)
{
wType = msg->MsgType;
wLen = msg->MsgLen;
}
else
{
ptr = (BYTE *)&msg->MsgType;
wType = ptr[0] * 256 + ptr[1];
ptr = (BYTE *)&msg->MsgLen;
wLen = ptr[0] * 256 + ptr[1];
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// wen 2005.09.28 Ôö¼Ó¶ÔudpͨѶ¶Ë¿ÚµÄÏÔʾ
/*if((CurPort == msg->PortIdx) && RealDataDispFlag)
{
if(SDS_SIO_SEND_DATA == wType)
{
WatchDataPutDispBuf(msg->PortIdx, SDS_SIO_SEND_DATA, msg->MsgData, wLen);
}
}*/
if(RealDataDispFlag)
{
if(CurPort == msg->PortIdx)
{
if(SDS_SIO_SEND_DATA == wType)
{
WatchDataPutDispBuf(msg->PortIdx, SDS_SIO_SEND_DATA, msg->MsgData, wLen);
}
}
else if(CurPort == GetMaxPort())
{
WatchDataPutDispBuf(msg->PortIdx, SDS_SIO_SEND_DATA, msg->MsgData, wLen);
}
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
}
return true;
}
//Ìî³äÅäÖýá¹û£¬·µ°üµ½ÉÏÐÐç·³å
int FillAndSendCmd(u_long ipaddr, u_char port, WORD cmd, u_char *retbuf, int len)
{
RTUMSG rtumsg;
u_char *ptr;
int tmp = 0;
rtumsg.PortIdx = port;
ptr = (u_char*)&rtumsg.MsgType;
ptr[0] = HIBYTE(cmd);
ptr[1] = LOBYTE(cmd);
ptr[2] = HIBYTE(len);
ptr[3] = LOBYTE(len);
if(len)
memmove((char *)rtumsg.MsgData, retbuf, len);
if(ipaddr)
tmp = SetUdpSend(ipaddr, (char*)&rtumsg, sizeof(RTUMSGHEAD) + len);
else
{
if(DevParam[iCurDevIdx].CurCommIp)
tmp = SetUdpSend(DevParam[iCurDevIdx].CurCommIp, (char*)&rtumsg, sizeof(RTUMSGHEAD) + len);
}
return tmp;
}
int GetSdsIpAddr(void)
{
/*SYSTEMTIME sm;
char szInfo[128];
GetLocalTime(&sm);
sprintf(szInfo, "%02d_%02d:%02d:%02d.%03d GetSdsIpAddr\n",
sm.wDay, sm.wHour, sm.wMinute, sm.wSecond, sm.wMilliseconds);
OutputDebugString(szInfo);*/
return FillAndSendCmd(INADDR_BROADCAST, 0, SDS_N_GET_IP_ADDR, NULL, 0);
}
void ValueToBuf(u_char *buf, u_long val, int len)
{
switch(len)
{
case 2:
buf[0] = HIBYTE(LOWORD(val));
buf[1] = LOBYTE(LOWORD(val));
break;
case 4:
buf[0] = HIBYTE(HIWORD(val));
buf[1] = LOBYTE(HIWORD(val));
buf[2] = HIBYTE(LOWORD(val));
buf[3] = LOBYTE(LOWORD(val));
break;
}
}
u_long BufToValue(u_char *buf, int len)
{
u_long retv;
switch(len)
{
case 2:
retv = BYTE1(buf[0]) + BYTE0(buf[1]);
break;
case 4:
retv = BYTE3(buf[0]) + BYTE2(buf[1]) + BYTE1(buf[2]) + BYTE0(buf[3]);
break;
}
return retv;
}
void AddDispLine(DISP_LINE_BUF *dispbuf, char *msg)
{
char szbuf[128], tmp[128];
int k;
k = strlen(msg);
if(k == 0)
return;
if(k > 120)
msg[120] = 0;
k = 120 - strlen(msg);
strcpy(szbuf, msg);
if(k > 0)
{
memset(tmp, ' ', 120);
tmp[k] = 0;
strcat(szbuf, tmp);
}
strcpy(dispbuf->Line[dispbuf->Rear], szbuf);
dispbuf->Rear = (dispbuf->Rear + 1) % MAX_DISP_LINE;
// µ±»º³åÇøÂúºó, ¶ªµôǰ°ë¸ö»º³åÇøÄÚÊý¾Ý£¬·ñÔò£¬
// ÎÒÃÇÎÞ·¨Í£ÏÂÀ´¹Û¿´ÒÑÓÐÊý¾Ý£¬Ëü¿ÉÄÜÒ»Ö±¹ö¶¯,
// ÒòΪÿÌí¼ÓÒ»ÐÐÎÒÃǵÄÖ¸Õë²»µÃ²»ÍËÈÃÒ»ÐÐ
dispbuf->LineCnt = dispbuf->LineCnt + 1;
if(dispbuf->LineCnt == MAX_DISP_LINE)
{
dispbuf->LineCnt -= MAX_DISP_LINE / 2;
}
}
void WatchDataPutDispBuf(int port, WORD type, u_char *buf, int len)
{
int i, j, k, linechar;
char szbuf[256], tmp[256], tchar;
SYSTEMTIME st;
if(giRealDataToFile == 1)
{
WatchDataPutDispBufToFile(port, type, buf, len);
return;
}
linechar = 18;
tchar = type == SDS_SIO_SEND_DATA ? 'S' : 'R';
GetLocalTime(&st);
szbuf[0] = tchar;
sprintf((char*)&szbuf[1], "%04d-%02d-%02d %02d:%02d:%02d.%03d ¶Ë¿Ú%d %s Êý¾Ý, ³¤¶È = %d",
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds,
port + 1, type == SDS_SIO_SEND_DATA ? "·¢ËÍ" : "½ÓÊÕ", len);
AddDispLine(&DevParam[iCurDevIdx].WatchDispLine, szbuf);
for (i = 0; i < len; i += linechar)
{
szbuf[0] = tchar;
sprintf((char*)&szbuf[1], "%04d: ", i);
k = min(linechar, len - i);
for (j = 0; j < k; j++)
{
sprintf(tmp, "%02X ", buf[i+j]);
strcat(szbuf, tmp);
if(((j + 1) % 6) == 0)
strcat(szbuf, " ");
}
AddDispLine(&DevParam[iCurDevIdx].WatchDispLine, szbuf);
}
sprintf(szbuf, "%c", tchar);
strcat(szbuf, " ");
AddDispLine(&DevParam[iCurDevIdx].WatchDispLine, szbuf);
}
void WatchDataPutDispBufToFile(int port, WORD type, u_char *buf, int len)
{
int i, j, k, linechar;
char szbuf[256], tmp[256], tchar;
char szFileName[256];
FILE *fp;
SYSTEMTIME st;
linechar = 18;
tchar = type == SDS_SIO_SEND_DATA ? 'S' : 'R';
GetLocalTime(&st);
//getcwd(szFileName, sizeof(szFileName));
sprintf(szFileName, "%s\\log\\realdata%02d.txt", IniFilePath, port+1);
fp = fopen(szFileName, "a");
szbuf[0] = tchar;
sprintf((char*)&szbuf[1], "%04d-%02d-%02d %02d:%02d:%02d.%03d ¶Ë¿Ú%d %s Êý¾Ý, ³¤¶È = %d",
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds,
port + 1, type == SDS_SIO_SEND_DATA ? "·¢ËÍ" : "½ÓÊÕ", len);
AddDispLine(&DevParam[iCurDevIdx].WatchDispLine, szbuf);
if(fp)
{
strcat(szbuf, "\n");
fwrite(szbuf, sizeof(char), strlen(szbuf), fp);
}
for (i = 0; i < len; i += linechar)
{
szbuf[0] = tchar;
sprintf((char*)&szbuf[1], "%04d: ", i);
k = min(linechar, len - i);
for (j = 0; j < k; j++)
{
sprintf(tmp, "%02X ", buf[i+j]);
strcat(szbuf, tmp);
if(((j + 1) % 6) == 0)
strcat(szbuf, " ");
}
AddDispLine(&DevParam[iCurDevIdx].WatchDispLine, szbuf);
if(fp)
{
strcat(szbuf, "\n");
fwrite(szbuf, sizeof(char), strlen(szbuf), fp);
}
}
sprintf(szbuf, "%c", tchar);
strcat(szbuf, " ");
AddDispLine(&DevParam[iCurDevIdx].WatchDispLine, szbuf);
if(fp)
{
strcpy(szbuf, " \n");
fwrite(szbuf, sizeof(char), strlen(szbuf), fp);
fclose(fp);
}
}
int FindDev( u_long ipaddr )
{
int i, j;
for ( i = 0; i < iDevNum; i++ )
{
for( j = 0; j < MAX_NET_NUM; j++ )
{
if ( DevParam[i].IpAddr[j] == 0 )
continue;
if ( DevParam[i].IpAddr[j] == ipaddr )
return i;
}
}
return -1;
}
int AddDev( u_long *addr, int num )
{
int i, dev;
for ( i = 0; i < num; i++ )
{
if ( addr[i] )
{
dev = FindDev( addr[i] );
if ( dev >= 0 )
return dev;
}
}
// ÐÂÉ豸
iDevNum++;
return iDevNum - 1;
}
void SetUdpRecvDataProcess(u_long ipaddr, u_char *buf, int len)
{
RTUMSG *msg;
int plen, i, k, dev, net;
u_long addr[MAX_NET_NUM];
WORD tmp;
char *ptr;
//char szInfo[256];
for(plen = 0; plen < len;)
{
msg = (RTUMSG*)&buf[plen];
//ÈÃÊýֵΪ¸ß×Ö½Úǰ£¬µÍ×Ö½Úºó(µ«´Ë´¦ÎÞÌØ±ðµÄ×÷Ó㬽öΪÁËÓë»úÆ÷Î޹ضøÉè)
tmp = BYTE1(buf[plen+1]) + BYTE0(buf[plen+2]);
msg->MsgType = tmp;
tmp = BYTE1(buf[plen+3]) + BYTE0(buf[plen+4]);
msg->MsgLen = tmp;
plen += (msg->MsgLen + sizeof(RTUMSGHEAD));
//if(!(msg->MsgType & 0x8000))
//{
// continue;
//}
switch(msg->MsgType & 0x3fff)
{
// »ñȡϵͳIPµ½ÉÏÐÐ
// 0x00 - 0x03×Ö½Ú: µÚÒ»Íø¿¨µØÖ·IPµØÖ·
// 0x044 - 0x07×Ö½Ú: µÚ¶þÍø¿¨µØÖ·IPµØÖ·
// 0x08×Ö½Ú£º ¶Ë¿ÚÊýÄ¿×ÜÊý£¬°üÀ¨ÍøÂçͨѶ¶Ë¿Ú
// 0x09 - 0xd×Ö½Ú£º ±£Áô
// 0x0e×Ö½Ú£º ´®ÐÐͨѶ¶Ë¿ÚÊýÄ¿
// 0x0f×Ö½Ú£º ÍøÂçͨѶ¶Ë¿ÚÊýÄ¿
// 0x10 - 4¸ö´ø0x00½áβµÄ×Ö·û´®£¬ËüÃÇÊÇÉ豸Ãû³Æ¡¢Èí¼þ°æ±¾¡¢
// Èí¼þ°æ±¾ÈÕÆÚºÍÖÆÔì³§ÉÌÃû³Æ
// ½ÓÏÂÀ´£¬Èç¹ûÍø¿¨ÊýÁ¿¶àÓÚ2¸ö£¬½Ó×ÅÌîд´ÓµÚÈýÍø¿¨
// ¿ªÊ¼µÄÍøÂçIPµØÖ·
case SDS_GET_IP_ADDR:
case SDS_N_GET_IP_ADDR:
if(!(msg->MsgType & 0x8000))
{
break;
}
for (i = 0; i < 2; i++)
{
addr[i] = BYTE3(msg->MsgData[i*4+0])
+ BYTE2(msg->MsgData[i*4+1])
+ BYTE1(msg->MsgData[i*4+2])
+ BYTE0(msg->MsgData[i*4+3]);
/*sprintf(szInfo, "NET%d: %d.%d.%d.%d\n",
i+1, msg->MsgData[i*4+0],
msg->MsgData[i*4+1],
msg->MsgData[i*4+2],
msg->MsgData[i*4+3]);
OutputDebugString(szInfo);*/
}
// Ìø¹ý4¸ö×Ö·û´®
k = 0x10;
ptr = (char*)&msg->MsgData[k];
k += (strlen(ptr) + 1);
ptr = (char*)&msg->MsgData[k];
k += (strlen(ptr) + 1);
ptr = (char*)&msg->MsgData[k];
k += (strlen(ptr) + 1);
ptr = (char*)&msg->MsgData[k];
k += (strlen(ptr) + 1);
net = (msg->MsgLen - k) / 4;
if((net + 2) > MAX_NET_NUM)
{
break;
}
for (i = 0; i < net; i++)
{
addr[2+i] = BYTE3(msg->MsgData[k+0])
+ BYTE2(msg->MsgData[k+1])
+ BYTE1(msg->MsgData[k+2])
+ BYTE0(msg->MsgData[k+3]);
/*sprintf(szInfo, "NET%d: %d.%d.%d.%d\n",
i+3, msg->MsgData[k+0],
msg->MsgData[k+1],
msg->MsgData[k+2],
msg->MsgData[k+3]);
OutputDebugString(szInfo);*/
k += 4;
}
net += 2;
dev = AddDev(&addr[0], net);
DevParam[dev].CurCommIp = ipaddr;
for (i = 0; i < MAX_NET_NUM; i++)
{
if(i < net)
{
if(DevParam[dev].IpAddr[i])
{
if(DevParam[dev].IpAddr[i] != addr[i])
DevParam[dev].IpAddrChangeFlag = 1;
}
DevParam[dev].IpAddr[i] = addr[i];
}
else
DevParam[dev].IpAddr[i] = 0;
}
DevParam[dev].NetNum = net;
DevParam[dev].PortNum = msg->MsgData[8];
DevParam[dev].SerialPortNum = msg->MsgData[0x0e];
DevParam[dev].NetPortNum = msg->MsgData[0x0f];
break;
case SDS_SIO_SET_CONFIG_FILE:
if(!(msg->MsgType & 0x8000))
{
break;
}
//dev = FindDev(ipaddr);
//if (dev < 0)
// break;
//ClrWaitFlag(dev);
tmp = BYTE1(msg->MsgData[0]) + BYTE0(msg->MsgData[1]);
// ´«Êä´íÎó, ÖØÀ´
if((msg->MsgType & 0xc000) == 0x4000)
{
tmp = 0;
}
SetDevConfigFile(tmp + 1);
break;
case SDS_SIO_RECV_DATA:
if(!CheckIsCurDevIpAddr(ipaddr))
{
break;
}
if(FunCallPtr[SioParam[msg->PortIdx].ProtocolIdx].RecvData)
{
FunCallPtr[SioParam[msg->PortIdx].ProtocolIdx].RecvData(msg->PortIdx,
msg->MsgData, msg->MsgLen);
//SioParam[msg->PortIdx].RecvCharNum += msg->MsgLen;
}
// wen 2004.11.25 ɾ³ýÊý¾Ý»º³åÇøÊý¾Ý³¤¶È(±£³ÖºÍ5249ÖеijÌÐòÒ»ÖÂ)
SioParam[msg->PortIdx].RecvBuf.MsgCnt = 0;
SioParam[msg->PortIdx].RecvCharNum += msg->MsgLen;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// wen 2006.04.24 Èç¹û½ö½öÊǽÓÊÕµ½Êý¾Ý£¬²»ÈÏΪ¶Ë¿Ú״̬ΪÕý³££¬
// ±ØÐëÊÇÐÞ¸ÄÁËÊý¾Ý¿âµã²ÅÈÏΪÊǶ˿ÚÕý³£¡£×ÓÕ¾³ýÍâ¡£
//SioParam[msg->PortIdx].LineCommCnt = 0;
//SioParam[msg->PortIdx].Status = TRUE;
//=============================================================
SioParam[msg->PortIdx].LineCommCnt = 0;
if(SioParam[msg->PortIdx].m_psBaoHu)
{
// Èç¹ûΪ×ÓÕ¾
if(SioParam[msg->PortIdx].m_psBaoHu->PortType)
{
SioParam[msg->PortIdx].Status = TRUE;
}
}
else
{
SioParam[msg->PortIdx].Status = TRUE;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//if((CurPort == msg->PortIdx) && RealDataDispFlag)
//{
// WatchDataPutDispBuf(msg->PortIdx, SDS_SIO_RECV_DATA, msg->MsgData, msg->MsgLen);
//}
break;
case SDS_SIO_SEND_DATA:
// Êý¾ÝÒѾ­½ÓÊÕ
//sprintf(szInfo, "TIP_(%08d): port=%d Send Data is received.\n",
// getpid(), msg->PortIdx+1);
//DebugPrint(szInfo);
break;
default:
//sprintf(szInfo, "ERR_(%08d): port=%d Recv Error(Func=%d).",
// getpid(), msg->PortIdx+1, msg->MsgType);
//DebugPrint(szInfo);
break;
}
}
}
void SetDevConfigFile(int blk)
{
if(SetDevConfigFileEx(gCurConfigFileName, blk) != 0)
{
//((CWidgetMainWnd *)qApp->mainWidget())->RestoreCursor();
}
}
int SetDevConfigFileEx(char *szPortConfigName, int blk)
{
char szbuf[1024];
int idx, blklen, iSendLen;
FILE *fp;
if(!DevParam[iCurDevIdx].CurCommIp)
{
////QTMessageBox("É豸ÅäÖÃÎļþ...", "ÎÞÓÐЧÉ豸!!!");
return -1;
}
if(szPortConfigName == NULL)
{
//QTMessageBox("É豸ÅäÖÃÎļþ...", "ÏÂ×°É豸ÅäÖÃÎļþÃû³Æ´íÎó!!!");
return -1;
}
if(strlen(szPortConfigName) == 0)
{
//QTMessageBox("É豸ÅäÖÃÎļþ...", "ÏÂ×°É豸ÅäÖÃÎļþÃû³Æ´íÎó!!!");
return -1;
}
// wen 2005.12.01 ÔÚÕâÀïÉèÖÃÈ«¾ÖµÄÅäÖÃÎļþÃû³Æ
if(blk == 0)
{
strcpy(gCurConfigFileName, szPortConfigName);
}
fp = fopen(szPortConfigName, "rb");
if(fp == NULL)
{
return -1;
}
for(idx = 0; ; idx++)
{
blklen = fread((char*)&szbuf[2], 1, BLK_SIZE, fp);
if(blklen < 1)
{
break;
}
if(idx == blk)
{
szbuf[0] = HIBYTE(blk);
szbuf[1] = LOBYTE(blk);
iSendLen = FillAndSendCmd(0, 0, SDS_SIO_SET_CONFIG_FILE, (u_char*)szbuf, blklen + 2);
fclose(fp);
if(iSendLen == 0)
{
//QTMessageBox("É豸ÅäÖÃÎļþ...", "ÏÂ×°É豸ÅäÖÃÎļþʧ°Ü!!!");
return -1;
}
return 0;
}
}
fclose(fp);
//MessageBox(NULL, "É豸ÅäÖÃÎļþÉèÖÃÍê³É!!!", "É豸ÅäÖÃÎļþ...", MB_OK | MB_ICONINFORMATION);
//QTMessageBox("É豸ÅäÖÃÎļþ...", "É豸ÅäÖÃÎļþÉèÖÃÍê³É!!!");
return 1;
}
void SetDevTime()
{
BYTE buf[16];
DAY_TIME sm;
GetLocalTimeEx(&sm);
buf[0] = HIBYTE(sm.Year);
buf[1] = LOBYTE(sm.Year);
buf[2] = 0;
buf[3] = sm.Month;
buf[4] = 0;
buf[5] = sm.Day;
buf[6] = 0;
buf[7] = sm.Hour;
buf[8] = 0;
buf[9] = sm.Min;
buf[10] = 0;
buf[11] = sm.Sec;
FillAndSendCmd(INADDR_BROADCAST, 0, SDS_SIO_SET_SYSTEM_TIME, buf, 12);
}
void ResetDev(int iDevNo)
{
if(iDevNo >= 0)
{
FillAndSendCmd(DevParam[iDevNo].CurCommIp, 0, SDS_SIO_RESET, NULL, 0);
}
else
{
FillAndSendCmd(0, 0, SDS_SIO_RESET, NULL, 0);
}
}
BOOL isUdpSocketExist()
{
if(UdpParam.Socket)
{
return TRUE;
}
else
{
return FALSE;
}
}