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 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 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 + @" 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; } } }