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

478 lines
22 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 System.Threading.Tasks;
using SystemX.Common.Protocol.SIA;
using static SystemX.Net.Platform.Common.Util.LogMessage;
using System.Threading;
using SystemX.Net.Middleware.Commons;
using SystemX.Net.Platform.SystemX.Common;
using CpTesterPlatform.CpLogUtil;
namespace SystemX.Net.MiddlewareUI
{
public partial class MainForm : DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm
{
private async void WatchRecvStreamQueue()
{
await Task.Delay(250);
Stopwatch stLogScanTimer = new Stopwatch();
stLogScanTimer.Start();
while (!m_bTaskStreamBlock)
{
try
{
CT.ThrowIfCancellationRequested();
}
catch (OperationCanceledException CancelEx)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @" Work Canceled. [SystemX.Net.MiddlewareUI : MainForm.WatchRecvStreamQueue]\r\n" + CancelEx.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
break;
}
//
try
{
if (bTaskStreamWaitLock == false) QueryRecvStreamQueue();
}
catch (Exception e)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"General Queue Process failed.[SystemX.Net.MiddlewareUI : MainForm.WatchRecvStreamQueue]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
await Task.Delay(10);
}
//return m_bTaskStreamBlock;
}
//private async void SendStreamEvent(byte[] senderData, ScheduleEvent e)
private void SendStreamEvent(byte[] senderData, ScheduleEvent e)
{
try
{
int iGetCall = e.CALL_NUMBER;
if (thisConnInfo[e.CALL_NUMBER].m_ucSendStreamToken == 0x00)
thisConnInfo[e.CALL_NUMBER].m_ucSendStreamToken = 0x01;
else if (thisConnInfo[e.CALL_NUMBER].m_ucSendStreamToken == 0x01)
thisConnInfo[e.CALL_NUMBER].m_ucSendStreamToken = 0x02;
else
thisConnInfo[e.CALL_NUMBER].m_ucSendStreamToken = 0x01;
thisConnInfo[e.CALL_NUMBER].m_iSendStreamCnt++;
if (thisConnInfo[e.CALL_NUMBER].m_iSendStreamCnt + 1 == int.MaxValue)
thisConnInfo[e.CALL_NUMBER].m_iSendStreamCnt = 0;
if (FlowStreamControl[iGetCall] == null)
return;
//소켓 샌드 행위 내부 결과
if (e.PROCESS_RESULT == false)
{
//해당 패킷 횟수 상승 일단 회 차시 기록남기고 드랍
FlowStreamControl[iGetCall].SendPacketCycle();
}
}
catch (Exception ex)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"General <SendStreamEvent> failed.[SystemX.Net.MiddlewareUI : MainForm.SendStreamEvent]\r\n" + ex.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
}
//private async void RecvStreamEvent(byte[] senderData, ScheduleEvent e)
private void RecvStreamEvent(byte[] senderData, ScheduleEvent e)
{
try
{
int iGetCall = e.CALL_NUMBER;
if (thisConnInfo[e.CALL_NUMBER].m_ucRecvStreamToken == 0x00)
thisConnInfo[e.CALL_NUMBER].m_ucRecvStreamToken = 0x01;
else if (thisConnInfo[e.CALL_NUMBER].m_ucRecvStreamToken == 0x01)
thisConnInfo[e.CALL_NUMBER].m_ucRecvStreamToken = 0x02;
else
thisConnInfo[e.CALL_NUMBER].m_ucRecvStreamToken = 0x01;
thisConnInfo[e.CALL_NUMBER].m_iRecvStreamCnt++;
if (thisConnInfo[e.CALL_NUMBER].m_iRecvStreamCnt + 1 == int.MaxValue)
thisConnInfo[e.CALL_NUMBER].m_iRecvStreamCnt = 0;
if (FlowStreamControl[iGetCall] == null)
return;
int iStoreCnt = senderData.Count();
byte[] recvStoreBuffer = senderData;
//소켓 리시브 행위 결과 전송
if (e.PROCESS_RESULT == false)
{
//받기 실패 단순 실패 응답
FlowStreamControl[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))
FlowStreamControl[iGetCall].SetSendPacketDrop();
else
FlowStreamControl[iGetCall].SendPacketCycle();
}
//파일 끝 응답
else if (GET_CODE == BASE_PROTOCOL.PROTOCOL_CODE.RAW_END)
{
if (XCommons.GetSimpleResponsResult(iStoreCnt, recvStoreBuffer))
FlowStreamControl[iGetCall].RawStoreQueuePOP();
else
FlowStreamControl[iGetCall].RawStoreQueuePOP();
}
//일반 응답
else
{
//성공 응답
FlowStreamControl[iGetCall].InsertSendQueue(DateTime.Now, XCommons.SetSimpleResponsPacket(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.SIMPLE_RESPONSE), true), null, false, false);
//받은 큐에 넣어놓기
FlowStreamControl[iGetCall].InsertRecvQueue(senderData, null, e.nLABEL);
}
}
}
catch (Exception ex)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @"General <RecvStreamEvent> failed.[SystemX.Net.MiddlewareUI : MainForm.RecvStreamEvent]\r\n" + ex.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
}
private void SendMiddlewareMessage(int iPos, string strMessage)
{
if (thisConnInfo[iPos].StreamConnectState == false)
return;
try
{
MESSAGE_PACKET MakeMessagePacket = new MESSAGE_PACKET();
int iSendSize = Marshal.SizeOf(MakeMessagePacket);
byte[] ucSendArray = new byte[iSendSize];
MakeMessagePacket = (MESSAGE_PACKET)SystemXNetSerialization.RawDeSerialize(ucSendArray, MakeMessagePacket.GetType());
MakeMessagePacket.objMessage[0].Data = strMessage;
byte[] ucSendByteInfo = XCommons.SpecialObjectToByteStream(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.MIDDLEWARE_MESSAGE), MakeMessagePacket);
FlowStreamControl[iPos].InsertSendQueue(DateTime.Now, ucSendByteInfo, null);
}
catch (Exception ex)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") +
@"Send error <Middleware> message.[SystemX.Net.MiddlewareUI : MainForm.SendMiddlewareMessage]\r\n" +
ex.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
}
}
private byte[] MakeTransferResult(bool bSetRecvResult, bool bSetProcessResult)
{
TRANSFER_PACKET TransferResult = new TRANSFER_PACKET();
int iSendSize = Marshal.SizeOf(TransferResult);
byte[] ucSendArray = new byte[iSendSize];
TransferResult = (TRANSFER_PACKET)SystemXNetSerialization.RawDeSerialize(ucSendArray, TransferResult.GetType());
TransferResult.bRecvResult = bSetRecvResult;
TransferResult.bProcessResult = bSetProcessResult;
byte[] ucSendByteInfo = XCommons.SpecialObjectToByteStream(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.TRANSFER_RESULT), TransferResult);
return ucSendByteInfo;
}
private bool QueryRecvStreamProcess(int iFlowPos, string strProcessInfo)
{
int i = iFlowPos;
bool bState = true;
//
XData getXData = FlowStreamControl[i].GetResultPacketData();
if (getXData == null)
return false;
try
{
thisConnInfo[i].stStreamProcessTime.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;
switch (CODE)
{
case BASE_PROTOCOL.PROTOCOL_CODE.CONNECT_STATE:
{
PING_PACKET GetPingPacket = (PING_PACKET)objData;
string strGetMsg = GetPingPacket.objCheckMsg[0].Data;
PING_PACKET PingPacketMake = new PING_PACKET();
int iSendSize = Marshal.SizeOf(PingPacketMake);
byte[] ucSendArray = new byte[iSendSize];
PingPacketMake = (PING_PACKET)SystemXNetSerialization.RawDeSerialize(ucSendArray, PingPacketMake.GetType());
PingPacketMake.objCheckMsg[0].Data = "SystemX";
byte[] ucSendByteInfo = XCommons.SpecialObjectToByteStream(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.CONNECT_STATE), PingPacketMake);
if (ServerStreamSock[i].CLIENT_CONNECT)
{
if (ucSendByteInfo != null)
FlowStreamControl[i].InsertSendQueue(DateTime.Now, ucSendByteInfo, null, ucGetLabel);
}
}
break;
case BASE_PROTOCOL.PROTOCOL_CODE.SYNC_TIME_SERVER:
{
TIME_PACKET GetTimePacket = (TIME_PACKET)objData;
string strGetMsg = GetTimePacket.objMsg[0].Data;
TIME_PACKET timePacketMake = new TIME_PACKET();
int iSendSize = Marshal.SizeOf(timePacketMake);
byte[] ucSendArray = new byte[iSendSize];
timePacketMake = (TIME_PACKET)SystemXNetSerialization.RawDeSerialize(ucSendArray, timePacketMake.GetType());
TimeControl.GetSyncTime(ref timePacketMake.objTime[0]);
timePacketMake.objMsg[0].Data = "SyncTimeSend";
byte[] ucSendByteInfo = XCommons.SpecialObjectToByteStream(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.SYNC_TIME_SERVER), timePacketMake);
if (ServerStreamSock[i].CLIENT_CONNECT)
{
if (ucSendByteInfo != null)
FlowStreamControl[i].InsertSendQueue(DateTime.Now, ucSendByteInfo, null, ucGetLabel);
}
}
break;
case BASE_PROTOCOL.PROTOCOL_CODE.FILE_TRANSFER:
{
string strFileExtension = getHeader.objOptionExtension[0].Data;
bool bGetResult = false;
if (strFileExtension.IndexOf(".CpLog") >= 0 ||
strFileExtension.IndexOf(".csv") >= 0)
{
//if (bUseMapLogProcess)
MappedLogQueueData.Enqueue(new Tuple<string, int, HEADER_PACKET, byte[]>("FILE_TRANSFER", i, getHeader, objData as byte[]));
bGetResult = true;
}
FlowStreamControl[i].InsertSendQueue(DateTime.Now, MakeTransferResult(true, bGetResult), null, PacketFlowControl.TransferResultToken, false);
}
break;
case BASE_PROTOCOL.PROTOCOL_CODE.RAW_SIZE:
{
if (getHeader.uiSourDataNum > 1)
{
if (thisConnInfo[i].nFileRecvPos > 0)
{
if ((thisConnInfo[i].nFileRecvPos + 1) != getHeader.uiSourDataNum ||
thisConnInfo[i].nFileRecvEndPos == 0)
{
thisConnInfo[i].nFileRecvPos = 0;
thisConnInfo[i].nFileRecvEndPos = 0;
FlowStreamControl[i].InsertSendQueue(DateTime.Now, XCommons.SetSimpleResponsPacket(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.RAW_END), false), null, false, false);
FlowStreamControl[i].InsertSendQueue(DateTime.Now, MakeTransferResult(false, false), null, PacketFlowControl.TransferResultToken, false);
break;
}
}
}
//
if (getHeader.uiSourDataNum == 1)
{
thisConnInfo[i].lstRecvFileBytes = new List<Tuple<int, byte[]>>();
thisConnInfo[i].lstRecvFileBytes.Clear();
thisConnInfo[i].lstRecvFileBytes.Add(new Tuple<int, byte[]>((int)getHeader.uiSourDataNum, objData as byte[]));
thisConnInfo[i].nFileRecvPos = (int)getHeader.uiSourDataNum;
thisConnInfo[i].nFileRecvEndPos = (int)getHeader.uiDestDataNum;
thisConnInfo[i].strRecvFileName = getHeader.objOptionName[0].Data;
thisConnInfo[i].strRecvFileExtension = getHeader.objOptionExtension[0].Data;
}
else
{
thisConnInfo[i].lstRecvFileBytes.Add(new Tuple<int, byte[]>((int)getHeader.uiSourDataNum, objData as byte[]));
thisConnInfo[i].nFileRecvPos++;
}
//
if (thisConnInfo[i].nFileRecvPos >= thisConnInfo[i].nFileRecvEndPos)
{
int iSize = 0;
thisConnInfo[i].lstRecvFileBytes.Sort();
foreach (Tuple<int, byte[]> tData in thisConnInfo[i].lstRecvFileBytes)
iSize += tData.Item2.Count();
byte[] ucGetDatas = new byte[iSize];
int iCopyPos = 0;
foreach (Tuple<int, byte[]> tData in thisConnInfo[i].lstRecvFileBytes)
{
Array.Copy(tData.Item2, 0, ucGetDatas, iCopyPos, tData.Item2.Count());
iCopyPos += tData.Item2.Count();
}
bool bGetResult = false;
if (thisConnInfo[i].strRecvFileExtension.IndexOf(".CpLog") >= 0 ||
thisConnInfo[i].strRecvFileExtension.IndexOf(".csv") >= 0)
{
//if (bUseMapLogProcess)
MappedLogQueueData.Enqueue(new Tuple<string, int, HEADER_PACKET, byte[]>("RAW_SIZE", i, getHeader, objData as byte[]));
bGetResult = true;
}
thisConnInfo[i].nFileRecvPos = 0;
thisConnInfo[i].nFileRecvEndPos = 0;
FlowStreamControl[i].InsertSendQueue(DateTime.Now, XCommons.SetSimpleResponsPacket(new BASE_PROTOCOL(BASE_PROTOCOL.PROTOCOL_CODE.RAW_END), true), null, false, false);
FlowStreamControl[i].InsertSendQueue(DateTime.Now, MakeTransferResult(true, bGetResult), null, PacketFlowControl.TransferResultToken, false);
}
}
break;
}
thisConnInfo[i].lStreamTime = thisConnInfo[i].stStreamProcessTime.ElapsedMilliseconds;
}
catch (Exception e)
{
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + strProcessInfo + @" Recv queue stream process fail.[SystemX.Net.MiddlewareUI : MainForm.QueryRecvStreamQueue]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
bState = false;
}
return bState;
}
private bool QueryRecvStreamQueue()
{
//StackTrace st = new StackTrace(true);
bool bState = true;
try
{
bTaskStreamWaitLock = true;
for (int i = PORT_DISTRIBUTION_NUM; i < ALL_MANAGE_NUM && !m_bTaskStreamBlock; i++)
{
if (ServerStreamSock[i] == null)
continue;
//
if (ServerStreamSock[i] != null)
{
if (ServerStreamSock[i].CLIENT_CONNECT == false)
continue;
}
//
if (FlowStreamControl[i] == null)
continue;
if (FlowStreamControl[i].GetCurrentRecvProcessData() != null)
continue;
//
thisConnInfo[i].m_iSendStreamQueueSize = FlowStreamControl[i].GetSendQueueSize();
thisConnInfo[i].m_iRecvStreamQueueSize = FlowStreamControl[i].GetRecvQueueSize();
if ((thisConnInfo[i].m_iSendStreamQueueSize + 1) == int.MaxValue)
thisConnInfo[i].m_iSendStreamQueueSize = 0;
if ((thisConnInfo[i].m_iRecvStreamQueueSize + 1) == int.MaxValue)
thisConnInfo[i].m_iRecvStreamQueueSize = 0;
//
string strProcessDebugInfo = string.Empty;
strProcessDebugInfo = "[" + (i).ToString("D2") + "]" +
"[" + ConnPool[i].nUseStreamPort + "]" +
"[" + thisConnInfo[i].strConnectHostID + "]" +
"[" + thisConnInfo[i].strConnectSection + "]";
bState = QueryRecvStreamProcess(i, strProcessDebugInfo);
}
}
catch (Exception e)
{
/*
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CpLogProcessInfo.strProcessDebugInfo + @" CpLog - " + $"ST Frame Count {st.FrameCount} [SystemX.Net.MiddlewareUI : MainForm.SetMemoryMappedFile] " + e.Message, ConsoleColor.Red, LogMessageLevel.FATAL);
for (int n = 0; n < st.FrameCount; n++)
{
StackFrame sf = st.GetFrame(n);
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CpLogProcessInfo.strProcessDebugInfo + @" CpLog - " + $"ST Method To String {sf.GetMethod()} [SystemX.Net.MiddlewareUI : MainForm.SetMemoryMappedFile] " + e.Message, ConsoleColor.Red, LogMessageLevel.FATAL);
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CpLogProcessInfo.strProcessDebugInfo + @" CpLog - " + $"ST Method Name {sf.GetMethod().Name} [SystemX.Net.MiddlewareUI : MainForm.SetMemoryMappedFile] " + e.Message, ConsoleColor.Red, LogMessageLevel.FATAL);
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CpLogProcessInfo.strProcessDebugInfo + @" CpLog - " + $"ST Line Number {sf.GetFileLineNumber()} [SystemX.Net.MiddlewareUI : MainForm.SetMemoryMappedFile] " + e.Message, ConsoleColor.Red, LogMessageLevel.FATAL);
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + CpLogProcessInfo.strProcessDebugInfo + @" CpLog - " + $"ST Column Number {sf.GetFileColumnNumber()} [SystemX.Net.MiddlewareUI : MainForm.SetMemoryMappedFile] " + e.Message, ConsoleColor.Red, LogMessageLevel.FATAL);
}
*/
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + @" Recv queue stream process unknown fail.[SystemX.Net.MiddlewareUI : MainForm.QueryRecvStreamQueue]\r\n" + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
bState = false;
}
finally
{
bTaskStreamWaitLock = false;
nStreamNumber++;
if (nStreamNumber >= ALL_MANAGE_NUM)
nStreamNumber = 0;
}
return bState;
}
}
}