Files
2024-06-26 10:30:00 +09:00

539 lines
23 KiB
C#

using DevExpress.Data.Helpers;
using DevExpress.XtraBars;
using DevExpress.XtraBars.Navigation;
using System;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Linq;
using System.IO;
using System.Diagnostics;
using SystemX.Net;
using SystemX.Common;
using SystemX.Net.BaseProtocol;
using SystemX.Net.Comm;
using SystemX.Net.Schedule;
using SystemX.Net.DB;
using SystemX.Common.Serialization;
using SystemX.Common.Archive;
using DevExpress.Utils.Extensions;
using System.Threading.Tasks;
using SystemX.Common.Protocol.SIA;
using static SystemX.Net.Platform.Common.Util.LogMessage;
using System.Threading;
using SystemX.Net.MiddlewareUI.UIM.Protocol_Method;
using static SystemX.Net.DB.XDBConnManager;
namespace SystemX.Net.MiddlewareUI
{
public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm
{
private async void WatchRecvCommandQueue()
{
await Task.Delay(250);
while (!m_bTaskCommandBlock)
{
try
{
CT.ThrowIfCancellationRequested();
}
catch (OperationCanceledException CancelEx)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @" Work Canceled. [SystemX.Net.MiddlewareUI : MainForm.WatchRecvCommndQueue]\r\n" + CancelEx.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
break;
}
//
try
{
if (bTaskCommandWaitLock == false) QueryRecvCommandQueue();
}
catch (Exception e)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"General Queue Process failed.[1] [SystemX.Net.MiddlewareUI : MainForm.WatchRecvCommndQueue]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
try
{
if (MngDBConn.GetMainDBAccessTime() >= 120000)
{
//lock (objSingleTransactionDataAccessWait)
{
QueryCommandProcess(eConnCategory.Main, "SELECT GETDATE() AS 'CHECK PING';");
}
}
if (MngDBConn.GetShortTermDBAccessTime() >= 120000)
{
//lock (objSingleTransactionDataAccessWait)
{
QueryCommandProcess(eConnCategory.ShortTerm, "SELECT GETDATE() AS 'CHECK PING';");
}
}
if (MngDBConn.GetLongTermDBAccessTime() >= 120000)
{
//lock (objSingleTransactionDataAccessWait)
{
QueryCommandProcess(eConnCategory.LongTerm, "SELECT GETDATE() AS 'CHECK PING';");
}
}
/*
For TestList Update Check
*/
for (int i = PORT_DISTRIBUTION_NUM; i < ALL_MANAGE_NUM; i++)
{
if (thisConnInfo[i].ClientConnectState == false)
continue;
foreach (var valuePair in thisTLLoadInfo[i].dicTLInfo)
{
if (valuePair.Value.bLoaded == false)
continue;
if (valuePair.Value.GetLoadedTime() <= 60000)
continue;
CustomProtocol_ cp = new CustomProtocol_();
string strGetQuery = cp.CheckTestListUpdate(valuePair.Value.strProdNo_C, valuePair.Value.strTestCode, valuePair.Value.strTestType, valuePair.Value.strVersion, valuePair.Value.strProdCode);
DataSet ds = null;
//lock (objSingleTransactionDataAccessWait)
{
ds = QueryCommandProcess(eConnCategory.Main, strGetQuery);
}
if (XCommons.isHasRow(ds) == false)
continue;
int nGetStationID = Convert.ToInt32(valuePair.Key.Split(';')[2]);
DateTime getTestListFileUpdateDT = Convert.ToDateTime(ds.Tables[0].Rows[0]["TestListFileUpdateDT"]);
if (valuePair.Value.TestListFileUpdateDT != getTestListFileUpdateDT)
SendClientAlarmUsePingPacket(i, "TLRL;" + nGetStationID.ToString("D2"));
valuePair.Value.SetLoadedTime();
}
}
}
catch (Exception e)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"General Queue Process failed.[2] [SystemX.Net.MiddlewareUI : MainForm.WatchRecvCommndQueue]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
await Task.Delay(10);
}
//return m_bTaskCommandBlock;
}
//private async void SendCommandEvent(byte[] senderData, ScheduleEvent e)
private void SendCommandEvent(byte[] senderData, ScheduleEvent e)
{
try
{
int iGetCall = e.CALL_NUMBER;
if (thisConnInfo[e.CALL_NUMBER].m_ucSendCommandToken == 0x00)
thisConnInfo[e.CALL_NUMBER].m_ucSendCommandToken = 0x01;
else if(thisConnInfo[e.CALL_NUMBER].m_ucSendCommandToken == 0x01)
thisConnInfo[e.CALL_NUMBER].m_ucSendCommandToken = 0x02;
else
thisConnInfo[e.CALL_NUMBER].m_ucSendCommandToken = 0x01;
thisConnInfo[e.CALL_NUMBER].m_iSendCommandCnt++;
if (thisConnInfo[e.CALL_NUMBER].m_iSendCommandCnt + 1 == int.MaxValue)
thisConnInfo[e.CALL_NUMBER].m_iSendCommandCnt = 0;
if (FlowCommandControl[iGetCall] == null)
return;
//소켓 샌드 행위 내부 결과
if (e.PROCESS_RESULT == false)
{
//해당 패킷 횟수 상승 일단 회 차시 기록남기고 드랍
FlowCommandControl[iGetCall].SendPacketCycle();
}
}
catch (Exception ex)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"General <SendCommandEvent> failed.[SystemX.Net.MiddlewareUI : MainForm.SendCommandEvent]\r\n" + ex.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
}
//private async void RecvCommandEvent(byte[] senderData, ScheduleEvent e)
private void RecvCommandEvent(byte[] senderData, ScheduleEvent e)
{
try
{
int iGetCall = e.CALL_NUMBER;
if (thisConnInfo[e.CALL_NUMBER].m_ucRecvCommandToken == 0x00)
thisConnInfo[e.CALL_NUMBER].m_ucRecvCommandToken = 0x01;
else if (thisConnInfo[e.CALL_NUMBER].m_ucRecvCommandToken == 0x01)
thisConnInfo[e.CALL_NUMBER].m_ucRecvCommandToken = 0x02;
else
thisConnInfo[e.CALL_NUMBER].m_ucRecvCommandToken = 0x01;
thisConnInfo[e.CALL_NUMBER].m_iRecvCommandCnt++;
if (thisConnInfo[e.CALL_NUMBER].m_iRecvCommandCnt + 1 == int.MaxValue)
thisConnInfo[e.CALL_NUMBER].m_iRecvCommandCnt = 0;
if (FlowCommandControl[iGetCall] == null)
return;
int iStoreCnt = senderData.Count();
byte[] recvStoreBuffer = senderData;
//소켓 리시브 행위 결과 전송
if (e.PROCESS_RESULT == false)
{
//받기 실패 단순 실패 응답
FlowCommandControl[iGetCall].InsertSendQueue(DateTime.Now, XCommons.SetSimpleResponsPacket(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.SIMPLE_RESPONSE), false), null, false, false);
}
else
{
BASE_PROTOCOL GET_PROTOCOL = XCommons.GetHeaderProtocol(iStoreCnt, recvStoreBuffer);
BASE_PROTOCOL.PROTOCOL_CODE GET_CODE = GET_PROTOCOL.GET_CURRENT_PROTOCOL;
//응답
if (GET_CODE == BASE_PROTOCOL.PROTOCOL_CODE.SIMPLE_RESPONSE)
{
if (XCommons.GetSimpleResponsResult(iStoreCnt, recvStoreBuffer))
FlowCommandControl[iGetCall].SetSendPacketDrop();
else
FlowCommandControl[iGetCall].SendPacketCycle();
}
//파일 끝 응답
else if (GET_CODE == BASE_PROTOCOL.PROTOCOL_CODE.RAW_END)
{
if (XCommons.GetSimpleResponsResult(iStoreCnt, recvStoreBuffer))
FlowCommandControl[iGetCall].RawStoreQueuePOP();
else
FlowCommandControl[iGetCall].RawStoreQueuePOP();
}
//일반 응답
else
{
//성공 응답
FlowCommandControl[iGetCall].InsertSendQueue(DateTime.Now, XCommons.SetSimpleResponsPacket(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.SIMPLE_RESPONSE), true), null, false, false);
//받은 큐에 넣어놓기
FlowCommandControl[iGetCall].InsertRecvQueue(senderData, null, e.nLABEL);
}
}
}
catch (Exception ex)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"General <RecvCommandEvent> failed.[SystemX.Net.MiddlewareUI : MainForm.RecvCommandEvent]\r\n" + ex.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
}
private bool QueryRecvCommandProcess(int iFlowPos, string strProcessInfo)
{
int i = iFlowPos;
bool bState = true;
//
XData getXData = FlowCommandControl[i].GetResultPacketData();
if (getXData == null)
return false;
try
{
thisConnInfo[i].stCommandProcessTime.Restart();
BASE_PROTOCOL GET_PROTOCOL = getXData.BaseProtocol;
BASE_PROTOCOL.PROTOCOL_CODE CODE = GET_PROTOCOL.GET_CURRENT_PROTOCOL;
HEADER_PACKET getHeader = getXData.HeaderPacket;
object objData = getXData.objData;
byte ucGetLabel = getXData.nLabel;
bool bUseLabel = true;
ProtocolShell PS = null;
switch (CODE)
{
case BASE_PROTOCOL.PROTOCOL_CODE.CONNECT_STATE:
PS = new CONNECT_STATE(this, i, ucGetLabel);
PS.ExecuteProtocol(GET_PROTOCOL,
CODE,
getHeader,
objData);
break;
case BASE_PROTOCOL.PROTOCOL_CODE.DATASET_TRANSEFER:
{
DataSet ds = null;
if (getXData.bReplayResult) //Query 성공
ds = objData as DataSet;
else //Query 실패
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessInfo + @" PROTOCOL_CODE.DATASET_TRANSEFER Fail.[SystemX.Net.MiddlewareUI : MainForm.QueryRecvCommandQueue]", ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
break;
case BASE_PROTOCOL.PROTOCOL_CODE.HOST_INFO_CHECK:
if (LoadInfo.USE_HOST_INFO)
{
PS = new HOST_INFO_CHECK(this, i, ucGetLabel);
PS.ExecuteProtocol(GET_PROTOCOL,
CODE,
getHeader,
objData);
bUseLabel = false;
}
break;
case BASE_PROTOCOL.PROTOCOL_CODE.PROCESS_QUERY:
PS = new PROCESS_QUERY(this, i, ucGetLabel);
PS.ExecuteProtocol(GET_PROTOCOL,
CODE,
getHeader,
objData);
break;
case BASE_PROTOCOL.PROTOCOL_CODE.SYSTEM_QUERY:
PS = new SYSTEM_QUERY(this, i, ucGetLabel);
PS.ExecuteProtocol(GET_PROTOCOL,
CODE,
getHeader,
objData);
break;
case BASE_PROTOCOL.PROTOCOL_CODE.USER_QUERY:
PS = new USER_QUERY(this, i, ucGetLabel);
PS.ExecuteProtocol(GET_PROTOCOL,
CODE,
getHeader,
objData);
break;
case BASE_PROTOCOL.PROTOCOL_CODE.ETC:
{
try
{
USER_PACKET CustomPacket = (USER_PACKET)objData;
}
catch (Exception e)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessInfo + @" <BASE_PROTOCOL.PROTOCOL_CODE.ETC:> Recv queue process fail.[SystemX.Net.MiddlewareUI : MainForm.QueryRecvCommandQueue]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
finally
{ }
}
break;
case BASE_PROTOCOL.PROTOCOL_CODE.INITILALIZE_INFO:
{
COMM_INFO_PACKET usPacket = (COMM_INFO_PACKET)objData;
if (ServerCommandSock[i].SOCK_TYPE == SOCKET_TYPE.TCP)
{
stWatchInitialTime[i].Restart();
m_bInitialCallState[i] = false;
InitializePortDistributionInfoSend(i, "MANUAL", false, PacketFlowControl.CommInfoManualToken);
thisConnInfo[i].ClientConnectState = false;
}
else if (ServerCommandSock[i].SOCK_TYPE == SOCKET_TYPE.UDP)
{
ServerCommandSock[i].strSetRemoteAddress = usPacket.objConnLocalAddress[0].Data;
ServerCommandSock[i].strSetRemotePort = usPacket.objConnLocalPort[0].Data;
stWatchInitialTime[i].Restart();
m_bInitialCallState[i] = true;
ConnPool[i].ConnWaitTimerReset();
thisConnInfo[i].Initialize();
thisConnInfo[i].ClientConnectState = true;
}
}
break;
}
if (ServerCommandSock[i].CLIENT_CONNECT && PS != null)
{
if (PS.GetShellSendOnState())
{
if (PS.nByteListSize > 0 && PS.IsByteList)
{
DateTime dtSendTime = DateTime.Now;
for (int j = 0; j < PS.nByteListSize; j++)
{
if (FlowStreamControl[i].InsertSendQueue(dtSendTime, PS.ArrSendByte(j), null, ucGetLabel, true, true) == PacketFlowControl.CommonErrCode)
throw new Exception();
}
}
else
{
if (PS.ArrSendByte() != null)
{
if (bUseLabel)
FlowCommandControl[i].InsertSendQueue(DateTime.Now, PS.ArrSendByte(), null, ucGetLabel);
else
FlowCommandControl[i].InsertSendQueue(DateTime.Now, PS.ArrSendByte(), null, false);
}
}
}
}
thisConnInfo[i].lCommandTime = thisConnInfo[i].stCommandProcessTime.ElapsedMilliseconds;
}
catch (Exception e)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessInfo + @" Recv queue process fail.[SystemX.Net.MiddlewareUI : MainForm.QueryRecvCommandProcess]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
bState = false;
}
return bState;
}
private bool QueryRecvCommandQueue()
{
bool bState = true;
string strProcessDebugInfo = "[Unknown]";
try
{
bTaskCommandWaitLock = true;
//Port-distribution
for (int i = 0; i < PORT_DISTRIBUTION_NUM; i++)
{
if (m_bTaskCommandBlock)
break;
if (ListenServerOnState[i] == false)
continue;
//0 ~ 10 : Listen Distribution
if (m_bInitialCallState[i])
{
if (stWatchInitialTime[i].ElapsedMilliseconds >= 100)
{
stWatchInitialTime[i].Restart();
m_bInitialCallState[i] = false;
InitializePortDistributionInfoSend(i, "AUTO", false, PacketFlowControl.CommInfoAutoToken);
thisConnInfo[i].ClientConnectState = false;
}
}
if (ServerCommandSock[i] == null)
continue;
if (FlowCommandControl[i] == null)
continue;
if (FlowCommandControl[i].GetCurrentRecvProcessData() != null)
continue;
strProcessDebugInfo = "[" + (i).ToString("D2") + "]" +
"[" + ConnPool[i].nUseCommandPort + "]" +
"[" + thisConnInfo[i].strConnectHostID + "]" +
"[" + thisConnInfo[i].strConnectSection + "]";
bState = QueryRecvCommandProcess(i, strProcessDebugInfo);
/*
else
{
if (thisConnInfo[i].ClientConnectState)
{
if (stWatchInitialTime[i].ElapsedMilliseconds >= 5000)
{
stWatchInitialTime[i].Restart();
InitializePortDistributionInfoSend(i, true);
}
}
}
*/
}
//Process
for (int i = PORT_DISTRIBUTION_NUM; i < ALL_MANAGE_NUM && !m_bTaskCommandBlock; i++)
{
if (ServerCommandSock[i] == null)
continue;
else {
if (ServerCommandSock[i].CLIENT_CONNECT == false) {
if (ConnPool[i].bLastConnState)
continue;
if (ConnPool[i].ConnWaitTime() >= 90000) {
//RemoveElement(i);
ClearServerInstance(i);
ConnPool[i].Initialize();
}
}
}
//
if (FlowCommandControl[i] == null)
continue;
if (FlowCommandControl[i].GetCurrentRecvProcessData() != null)
continue;
//
if (m_bInitialCallState[i])
{
//접속 후 1초 뒤 Initial
if (stWatchInitialTime[i].ElapsedMilliseconds >= 1000)
{
m_bInitialCallState[i] = false;
InitializeInfoSend(i);
}
}
//
thisConnInfo[i].m_iSendCommandQueueSize = FlowCommandControl[i].GetSendQueueSize();
thisConnInfo[i].m_iRecvCommandQueueSize = FlowCommandControl[i].GetRecvQueueSize();
if ((thisConnInfo[i].m_iSendCommandQueueSize + 1) == int.MaxValue)
thisConnInfo[i].m_iSendCommandQueueSize = 0;
if ((thisConnInfo[i].m_iRecvCommandQueueSize + 1) == int.MaxValue)
thisConnInfo[i].m_iRecvCommandQueueSize = 0;
strProcessDebugInfo = "[" + (i).ToString("D2") + "]" +
"[" + ConnPool[i].nUseCommandPort + "]" +
"[" + thisConnInfo[i].strConnectHostID + "]" +
"[" + thisConnInfo[i].strConnectSection + "]";
bState = QueryRecvCommandProcess(i, strProcessDebugInfo);
}
}
catch (Exception e)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessDebugInfo + @" Recv queue process fail.[SystemX.Net.MiddlewareUI : MainForm.QueryRecvCommandQueue]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
bState = false;
}
finally
{
bTaskCommandWaitLock = false;
nCommandNumber++;
if (nCommandNumber >= ALL_MANAGE_NUM)
nCommandNumber = 0;
}
return bState;
}
}
}