| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039 | using System;using System.Collections.Generic;using System.Text;using System.Net;using System.Net.Sockets;using System.IO;using System.Threading;using System.Runtime.Serialization.Formatters.Binary;using System.Runtime.InteropServices;using System.Reflection;using System.Diagnostics;namespace FPER{    public class TSocket    {// 소켓 클래스        private TcpClient cmd_tcpclient;        private TcpClient event_tcpclient;        private Tprotocol tprotocol;        private String DestIP;        private int commandPort;        private int eventPort;        private Thread cmd_rcv_th;        private int cmd_rcv_th_state = 0;        private NetworkStream cmd_sendStm, cmd_recvStm;        private NetworkStream event_sendStm, event_recvStm;        private Thread event_rcv_th;        private int event_rcv_th_state;        byte[] CMD_RcvBuffer = new byte[2048];        int CMD_RcvBufferPos = 0;        LogFileCreate LFC = new LogFileCreate();        private bool cmdConnected = false;        private bool eventConnected = false;        public delegate int dRcvProcess(byte[] buffer, int size);        private event dRcvProcess CMDRcvProcess;        private event dRcvProcess EVENTRcvProcess;        public TSocket(String Dest_ip, int commandPort, int eventPort, int Demon_ID, Tprotocol tp)        {            try            {                this.DestIP = Dest_ip;                // LCH 2018.02.27 : 데몬을 다른 PC에 둔다                //this.DestIP = "192.168.100.218";                this.commandPort = commandPort;                this.eventPort = eventPort;                this.tprotocol = tp;                CMDRcvProcess += new dRcvProcess(this.tprotocol.CMDResponceFunc);                EVENTRcvProcess += new dRcvProcess(this.tprotocol.EVENTCallFunc);                this.cmd_tcpclient = new TcpClient();                this.event_tcpclient = new TcpClient();            }            catch (Exception ex)            {                Util.UErrorMessage(ex, 0, 0);            }        }        public int ConnectSocket()        {// 소켓 연결 함수             int iret = 0;            try            {                iret = this.Start_Connection();                if (iret == 1)                {// 연결 성공시                     this.cmdConnected = true;                    this.eventConnected = true;                    iret = this.cmd_tcpclient.Connected ? 1 : 0;                }            }            catch (Exception ex)            {                iret = -1;                Util.UErrorMessage(ex, 0, 0);            }            return iret;        }        public int DisconnectToDemon(int Own_ID, int Demon_ID)        {// 데몬 연결 해제            try            {                Stop_Connection();                this.cmdConnected = false;                this.eventConnected = false;            }            catch (Exception ex)            {                Util.UErrorMessage(ex, 0, 0);            }            return 0;        }        IPEndPoint CommandEndPoint { get { return new IPEndPoint(IPAddress.Parse(this.DestIP), this.commandPort); } }        IPEndPoint EventEndPoint { get { return new IPEndPoint(IPAddress.Parse(this.DestIP), this.eventPort); } }        //cmd연결정보        public Boolean cmd_Connected        {//2010,11,22, k.s.d , demon connection status check routine rollback , ( 탁은임 과장이 중간에 바꿨음. 왜 바꾼지는 모름 )            get            {                Boolean TcpConnected = false;                try                {                    //if (this.cmd_tcpclient != null) {                    //  TcpConnected = this.cmd_tcpclient.Connected;                    //  if (TcpConnected) {                    //    TcpConnected = this.cmdConnected;                    //  }                    //}                    ////                    if (this.cmd_tcpclient != null) TcpConnected = this.cmdConnected;                }                catch (Exception ex)                {                    Util.UErrorMessage(ex, 0, 0);                }                return TcpConnected;            }        }        //이벤트연결정보        public Boolean event_Connected        {//2010,11,22, k.s.d , demon connection status check routine rollback , ( 탁은임 과장이 중간에 바꿨음. 왜 바꾼지는 모름 )            get            {                Boolean TcpConnected = false;                try                {                    //if (this.event_tcpclient != null) {                    //  TcpConnected = this.event_tcpclient.Connected;                    //  if (TcpConnected) {                    //    TcpConnected = this.eventConnected;                    //  }                    //}                    ////                    if (this.event_tcpclient != null) TcpConnected = this.eventConnected;                }                catch (Exception ex)                {                    Util.UErrorMessage(ex, 0, 0);                }                return TcpConnected;            }        }        public int Start_Connection()        {// 연결 시작 함수             int ret = 0;            try            {                ret = Start_Con_cmd();                if (ret == 1)                {// 연결 성공                    ret = Start_Con_event();                }            }            catch (Exception ex)            {                ret = -1;                Util.UErrorMessage(ex, 0, 0);            }            return ret;        }        // cyim 2016.12.29 : 화면 멈춤 문제 수정        public delegate void Connect_Thread_Inform_Handler();        public event Connect_Thread_Inform_Handler Connect_Thread_Inform_Event;        public bool Connect_Thread_Inform_Event_Receive = false;        public void Connect_Thread(TcpClient socket, int port, TimeSpan timeout)        {            Connect_Thread_Inform_Event_Receive = false;            if (this.Connect_Thread_Inform_Event != null)                this.Connect_Thread_Inform_Event -= new Connect_Thread_Inform_Handler(TSocket_Connect_Thread_Inform_Event);            this.Connect_Thread_Inform_Event += new Connect_Thread_Inform_Handler(TSocket_Connect_Thread_Inform_Event);            _ConnectThread ConnectThread = new _ConnectThread();            ConnectThread.socket = socket;            ConnectThread.port = port;            ConnectThread.timeout = timeout;            // 스레드로 실행            Thread WorkingThread = new Thread(new ParameterizedThreadStart(Connect_Thread_WorkFunction));            WorkingThread.Start(ConnectThread);            // cyim 2017.01.02             // 프로그램 구조를 잡은 최초 개발자의 의도와는 다르게 소방 수신반의 화면멈춤을 처리하기 위해 일부 변경해야 한다            // 즉, 코드 루틴 중간에 접속을 위한 딜레이가 발생하는것은 어쩔수없이 이벤트 처리를 해야한다            // 소스 루틴 중간에 접속여부를 물어보는 코드를 비동기로 처리하기 위해서 AutoResetEvent 와 같이 스레드가 무한으로 이벤트를 기다리게 할수는 있지만            // 현재 구성된 구조를 변경해야 되므로 비동기+스레드 인 현재 상황에서는 이 방법이 최선인것같다             while (true)            {                if (Connect_Thread_Inform_Event_Receive)                    break;            }            if (this.Connect_Thread_Inform_Event != null)                this.Connect_Thread_Inform_Event -= new Connect_Thread_Inform_Handler(TSocket_Connect_Thread_Inform_Event);        }        public void TSocket_Connect_Thread_Inform_Event()        {            Connect_Thread_Inform_Event_Receive = true;        }        // 접속함수를 스레드도 대체하고 타임아웃을 발생시켜서 결과를 획득한다        public bool Connect_Thread_Result = false;        public void Connect_Thread_WorkFunction(object obj)        {            // 소켓 접속을 위한 정보            _ConnectThread ConnectThread = (_ConnectThread)obj;            TcpClient socket = ConnectThread.socket;            int port = ConnectThread.port;            TimeSpan timeout = ConnectThread.timeout;            try            {                IPAddress addr = IPAddress.Parse(this.DestIP);                var result = socket.BeginConnect(addr, port, null, null);                bool success = result.AsyncWaitHandle.WaitOne(timeout, true);                if (success)                {                    socket.EndConnect(result);                    Connect_Thread_Result = true;                }                else                {                    socket.Close();                    Connect_Thread_Result = false;                    Console.WriteLine(this.DestIP);                }            }            catch            {                socket.Close();                Connect_Thread_Result = false;            }            TSocket_Connect_Thread_Inform_Event();        }        // 2010,11,25, k.s.d , return value add .         int Start_Con_cmd()        {            int ret = 0;            try            {                // cyim 2016.12.29 : 화면 멈춤 문제 수정                if (_Data.FireDeskMode == true)                {                    Connect_Thread(this.cmd_tcpclient, this.commandPort, new TimeSpan(0, 0, 1));                }                else                {                    this.cmd_tcpclient.Connect(this.CommandEndPoint);                }                this.cmd_sendStm = new NetworkStream(this.cmd_tcpclient.Client);                this.cmd_recvStm = new NetworkStream(this.cmd_tcpclient.Client);                this.cmd_rcv_th = new Thread(this.Cmd_ReceiveThread);                this.cmd_rcv_th_state = 1;                if (this.cmd_rcv_th != null)  // 쓰레드 할당 여부 확인후 동작시킴.                {                    this.cmd_rcv_th.Start();                }                ret = 1;            }            catch (Exception ex)            {                ret = -1;                Util.UErrorMessage(ex, 0, 0);            }            return ret;        }        // 2010,11,25, k.s.d , return value add .         int Start_Con_event()        {            int ret = 0;            try            {                // cyim 2016.12.29 : 화면 멈춤 문제 수정                if (_Data.FireDeskMode == true)                {                    Connect_Thread(this.event_tcpclient, this.eventPort, new TimeSpan(0, 0, 1));                }                else                {                    this.event_tcpclient.Connect(this.EventEndPoint);                }                this.event_sendStm = new NetworkStream(this.event_tcpclient.Client);                if (this.event_sendStm == null)                {                    ret = -1;                    return ret;                }                this.event_recvStm = new NetworkStream(this.event_tcpclient.Client);                if (this.event_recvStm == null)                {                    ret = -1;                    return ret;                }                this.event_rcv_th = new Thread(this.Event_ReceiveThread);                if (this.event_rcv_th != null)                {                    //===============================================                    // 에러 발견 수정 2013-06-05  CSW                    //===============================================                    this.event_rcv_th_state = 1;                    this.event_rcv_th.Start();                    ret = 1;                }                else                {                    ret = -1;                }                //Util.UDebugMessage("Start_Con_event Start",0,0);            }            catch (Exception ex)            {                ret = -1;                Util.UErrorMessage(ex, 0, 0);            }            return ret;        }        public void Stop_Connection()        {            try            {                //Util.UDebugMessage("Stop",0,0);                Stop_Con_cmd();                Stop_Con_event();            }            catch (Exception ex)            {                Util.UErrorMessage(ex, 0, 0);            }        }        void Stop_Con_cmd()        {            try            {                //        if (this.cmd_rcv_th_state == 1) this.cmd_rcv_th.Abort();                if (this.cmd_rcv_th != null) // cyim 2016.12.28 : 예외처리 추가                    if (this.cmd_rcv_th.IsAlive)                        this.cmd_rcv_th.Abort();  // 쓰레드 종료.                if (this.cmd_tcpclient != null) this.cmd_tcpclient.Close();            }            catch (Exception ex)            {                Util.UErrorMessage(ex, 0, 0);            }        }        void Stop_Con_event()        {            try            {                //if (this.event_rcv_th_state == 1) this.event_rcv_th.Abort();                if (this.event_rcv_th != null) // cyim 2016.12.28 : 예외처리 추가                    if (this.event_rcv_th.IsAlive)                        this.event_rcv_th.Abort();                if (this.event_tcpclient != null) this.event_tcpclient.Close();            }            catch (Exception ex)            {                Util.UErrorMessage(ex, 0, 0);            }        }        //명령전송        public int Cmd_Send(byte[] bt, int size)        { //2010.3.12ksd ,// cmd 전송 함수             int ret = 0;            try            {                if (this.cmd_tcpclient != null)                {                    if (this.cmd_tcpclient.Connected)                    {                        try                        {                            string Data = String.Empty;                            for (int i = 0; i < bt.Length; i++)                            {                                string value = Convert.ToString(bt[i], 16);                                if (value.Length == 1) value = "0" + value;                                Data += value + " ";                            }                            if (Data.Substring(12, 2) != "14")                                LFC.Log("[ Commo ] [전송] " + Data);                            if (_Data.Enable_Log == true)                            {                                _Event.Log_SendMessage_Write("[ Commo ] [전송] " + Data);                            }                            this.cmd_sendStm.Write(bt, 0, size);                            this.cmd_sendStm.Flush();                            ret = 1;                        }                        catch (Exception ex)                        {                            Util.UErrorMessage(ex, 0, 0);                            ret = -3;                        }                    }                    else                    {                        ret = -2;                    }                }                else                {                    ret = -1;                }            }            catch (Exception ex)            {                ret = -1;                Util.UErrorMessage(ex, 0, 0);            }            return ret;        }        void Cmd_ReceiveThread()        {//cmd listen thread             byte[] ReadBuffer = new byte[1024];            int offset = 0;            while (this.cmd_rcv_th_state == 1)            {                try                {                    if (this.cmd_tcpclient.Connected)                    {                        // cyim 2013.7.19 속도개선작업                        //for (int i = 0; i < 1024; i++)                        //{                        //    ReadBuffer[i] = 0x00;                        //}                        Array.Clear(ReadBuffer, 0, 1024);                        offset = 0;                        if (this.cmd_recvStm.CanRead)                        {                            offset = this.cmd_recvStm.Read(ReadBuffer, 0, ReadBuffer.Length);                            //Debug.WriteLine("Receive Read : " + offset.ToString());                            if (offset > 0)                            {                                //Debug.WriteLine(ToHex(ReadBuffer, offset));                                string Data = String.Empty;                                for (int i = 0; i < offset; i++) // for (int i = 0; i < ReadBuffer.Length; i++)                                {                                    string value = Convert.ToString(ReadBuffer[i], 16);                                    if (value.Length == 1) value = "0" + value;                                    Data += value + " ";                                }                                if (Data.Substring(12, 2) != "80" && Data.Substring(12, 2) != "94")                                    LFC.Log("[ Commo ] [응답] " + Data);                                if (_Data.Enable_Log == true)                                {                                    _Event.Log_SendMessage_Write("[ Commo ] [응답] " + Data);                                    System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + " 응답 " + Data + "\r\n");                                }                                CMDReceiveMSGProc(ReadBuffer, offset);                            }                            else                            {                                if (cmd_recvStm.DataAvailable)                                {                                    //Debug.WriteLine("cmd_recvStm.DataAvailable");                                }                                else                                {                                    //Debug.WriteLine("Error");                                    this.cmd_rcv_th_state = 0;                                    this.cmdConnected = false;                                    break;                                }                            }                        }                        else                        {                            //Debug.WriteLine("Error");                            this.cmd_rcv_th_state = 0;                            this.cmdConnected = false;                            break;                        }                        this.cmd_recvStm.Flush();                    }                    else                    {                        // don't connected                        //Debug.WriteLine("Error");                        this.cmd_rcv_th_state = 0;                        this.cmdConnected = false;                        break;                    }                }                catch (Exception ex)                {                    Util.UErrorMessage(ex, 0, 0);                    //Debug.WriteLine(e.ToString());                    //Debug.WriteLine("Error");                    this.cmd_rcv_th_state = 0;                    this.cmdConnected = false;                    break;                }            }            this.cmd_rcv_th_state = 0;        }        //void Cmd_ReceiveThread()        //{        //    try        //    {        //        byte[] ReadBuffer = new byte[1024];        //        int offset = 0;        //        while (this.cmd_rcv_th_state == 1)        //        {        //            if (this.cmd_tcpclient.Connected)        //            {        //                //Debug.WriteLine("Receive Connected");        //                for (int i = 0; i < 1024; i++)        //                {        //                    ReadBuffer[i] = 0x00;        //                }        //                offset = 0;        //                if (this.cmd_recvStm.CanRead)        //                {        //                    //Debug.WriteLine("Receive CanRead");        //                    offset = this.cmd_recvStm.Read(ReadBuffer, 0, ReadBuffer.Length);        //                    //Debug.WriteLine("Receive Read");        //                    if (offset > 0)        //                    {        //                        Debug.WriteLine(ToHex(ReadBuffer, offset));        //                        CMDReceiveMSGProc(ReadBuffer, offset);        //                    }        //                    else        //                    {        //                        //데몬이 죽었다..        //                        this.cmd_rcv_th_state = 0;        //                        Stop_Con_cmd();        //                        break;        //                    }        //                }        //                //데몬이 끊기면 무한루프 돈다..        //                //if (!this.cmd_recvStm.DataAvailable) this.cmd_rcv_th_state = 0;        //                this.cmd_recvStm.Flush();        //            }        //            else        //            {        //                // don't connected        //                break;        //            }        //        }        //        this.cmd_rcv_th_state = 0;        //    }        //    catch (Exception ex)        //    {        //       MessageBox.Show(string.Format("[{0}]\r\n{1}",ex.Message,ex.Source),Application.ProductName);        //    }        //}        void CMDReceiveMSGProc(byte[] ReadBuffer, int size)        {            // cmd message processing function            // cyim 2013.7.19 속도개선작업            //init buffer            //for (int i = 0; i < 2048; i++)            //{            //    CMD_RcvBuffer[i] = 0x00;            //}            Array.Clear(CMD_RcvBuffer, 0, 2048);            CMD_RcvBufferPos = 0;            for (int i = 0; i < size; i++)            {                //copy buffer                CMD_RcvBuffer[CMD_RcvBufferPos + i] = ReadBuffer[i];            }            CMD_RcvBufferPos += size;            int datasize = CMD_RcvBuffer[3];            if (datasize == 0)            {                datasize = (CMD_RcvBuffer[5] & 0xff | (CMD_RcvBuffer[6] << 8) & 0xff00) & 0xffff;            }            //CMDResponceFunc(datasize);            byte[] cmdbuffer = new byte[datasize + 1];            Array.Copy(CMD_RcvBuffer, 0, cmdbuffer, 0, datasize + 1);            //for (int i = 0; i < rcvSize + 1; i++)            //{//copy data            //    cmdbuffer[i] = rcvBuff[i];            //}            for (int i = 0; i < 2048; i++)            {//rcv buffer compress                if (i < CMD_RcvBufferPos)                {                    CMD_RcvBuffer[i] = CMD_RcvBuffer[i + datasize + 1];                }                else                {                    CMD_RcvBuffer[i] = 0x00;                }                CMD_RcvBufferPos -= datasize + 1;            }            //명령처리 이벤트            CMDRcvProcess(cmdbuffer, datasize);        }        public void Event_Send(byte[] bt, int size)        {  //2010.3.17_moon //don't using            try            {                if (this.event_tcpclient != null)                {                    if (this.event_tcpclient.Connected)                    {                        this.event_sendStm.Write(bt, 0, size);                        this.event_sendStm.Flush();                    }                }            }            catch (Exception ex)            {                Util.UErrorMessage(ex, 0, 0);            }        }        //void Event_ReceiveThread()        //{        //    byte[] ReadBuffer = new byte[1024];        //    int offset = 0;        //    while (this.event_rcv_th_state == 1)        //    {        //        if (this.event_tcpclient.Connected)        //        {        //            //              Debug.WriteLine("Event_ReceiveThread");        //            try        //            {        //                if (this.event_recvStm.CanRead)        //                {        //                    for (int i = 0; i < 1024; i++)        //                    {        //                        ReadBuffer[i] = 0x00;        //                    }        //                    offset = this.event_recvStm.Read(ReadBuffer, 0, ReadBuffer.Length);        //                    if (offset > 0)        //                    {        //                        string str;        //                        str = ToHex(ReadBuffer, offset);        //                        Debug.WriteLine("Event_ReceiveThread size : " + offset.ToString() + "//data : " + str);        //                        //                        Debug.WriteLine(string.Format("0x{0:x2} ", ReadBuffer[offset-1]));        //                        EVENTReceiveMSGFunc(ReadBuffer, offset);        //                    }        //                    else        //                    {        //                        //데몬이 죽었다..        //                        this.event_rcv_th_state = 0;        //                        Stop_Con_event();        //                        break;        //                    }        //                }        //                this.event_recvStm.Flush();        //                // call main func -> case by case        //            }        //            catch (Exception e)        //            {        //                //error        //                Debug.WriteLine(e.Message);        //            }        //        }        //        else        //        {        //            break;        //        }        //    }        //    this.event_rcv_th_state = 0;        //}        void Event_ReceiveThread()        {// event listen thread             byte[] ReadBuffer = new byte[3072];//2048            int offset = 0;            while (this.event_rcv_th_state == 1)            {                if (this.event_tcpclient.Connected)                {                    //              //Debug.WriteLine("Event_ReceiveThread");                    try                    {                        if (this.event_recvStm.CanRead)                        {                            // cyim 2013.7.19 속도개선작업                            //for (int i = 0; i < 3072; i++)                            //{                            //    ReadBuffer[i] = 0x00;                            //}                            Array.Clear(ReadBuffer, 0, 3072);//2048                            offset = this.event_recvStm.Read(ReadBuffer, 0, ReadBuffer.Length);                            if (offset > 0)                            {                                string str;                                str = ToHex(ReadBuffer, offset);                                //Debug.WriteLine("Event_ReceiveThread size : " + offset.ToString() + "//data : " + str);3072                                //                        //Debug.WriteLine(string.Format("0x{0:x2} ", ReadBuffer[offset-1]));                                //Util.LogBineryWrite(ReadBuffer, offset);    //데몬에서 보내온 패킷을 파일에 저장한다.. --임시                                EVENTReceiveMSGFunc(ReadBuffer, offset);                                // LCH 2018.02.27 : 이벤트 로그                                /*                                if (_Data.Enable_Log == true)                                {                                    string Data = String.Empty;                                    for (int i = 0; i < offset; i++) // for (int i = 0; i < ReadBuffer.Length; i++)                                    {                                        string value = Convert.ToString(ReadBuffer[i], 16);                                        if (value.Length == 1) value = "0" + value;                                        Data += value + " ";                                    }                                    _Event.Log_SendMessage_Write("[ Event ] [응답] " + Data);                                    LFC.Log("[ Event ] [응답] " + Data);                                    //System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + " 응답 " + Data + "\r\n");                                }                                else                                {                                    string Data = String.Empty;                                    for (int i = 0; i < offset; i++) // for (int i = 0; i < ReadBuffer.Length; i++)                                    {                                        string value = Convert.ToString(ReadBuffer[i], 16);                                        if (value.Length == 1) value = "0" + value;                                        Data += value + " ";                                    }                                    LFC.Log("[ Event ] [응답] " + Data);                                }*/                            }                            else                            {                                if (event_recvStm.DataAvailable)                                {                                    //Debug.WriteLine("cmd_recvStm.DataAvailable");                                }                                else                                {                                    //Debug.WriteLine("Error");                                    this.event_rcv_th_state = 0;                                    this.eventConnected = false;                                    break;                                }                            }                        }                        else                        {                            //Debug.WriteLine("Error");                            this.cmd_rcv_th_state = 0;                            this.cmdConnected = false;                            break;                        }                        this.event_recvStm.Flush();                        // call main func -> case by case                    }                    catch (Exception ex)                    {                        Util.UErrorMessage(ex, 0, 0);                        //Debug.WriteLine(e.Message);                        //Debug.WriteLine("Error");                        this.cmd_rcv_th_state = 0;                        this.cmdConnected = false;                        break;                    }                }                else                {                    //Debug.WriteLine("Error");                    this.cmd_rcv_th_state = 0;                    this.cmdConnected = false;                    break;                }            }            this.event_rcv_th_state = 0;        }        byte[] EVENT_RcvBuffer = new byte[6144];        int EVENT_RcvBufferPos = 0;        void EVENTReceiveMSGFunc(byte[] ReadBuffer, int size)        {            // event data processing functin             //Util.LogWrite(string.Format("EVENTReceiveMSGFunc() ReadBuffer:{0},size:{1}", Util.ToHex(ReadBuffer), size));            if ((EVENT_RcvBufferPos < 0) && (EVENT_RcvBufferPos > 3072))            {                // cyim 2013.7.19 버퍼 초과 경고창                //Util.LogWrite(string.Format("버퍼사이즈 초과!! 에러 EVENT_RcvBufferPos:{0}", EVENT_RcvBufferPos));                // cyim 2015.8.4 수신반을 위한 static 클래스 정리  : 불필요한 루틴 제거                //mdi.Event.SocketBufferError_Inform_Write(string.Format("버퍼사이즈 초과!! 에러 EVENT_RcvBufferPos:{0}", EVENT_RcvBufferPos));                // cyim 2013.7.19 속도개선작업                //init buffer                //for (int i = 0; i < 3072; i++)                //{                                //    EVENT_RcvBuffer[i] = 0x00;                //}                Array.Clear(EVENT_RcvBuffer, 0, 3072);                EVENT_RcvBufferPos = 0;            }            for (int i = 0; i < size; i++)            {                //copy buffer                EVENT_RcvBuffer[EVENT_RcvBufferPos + i] = ReadBuffer[i];            }            EVENT_RcvBufferPos += size;            while (EVENT_RcvBufferPos > 7)            {                // data minimum size                 if (EVENT_RcvBuffer[0] == 0x02)                {                    // stx                    if (EVENT_RcvBuffer[3] == 0x00)                    {                        //extend size                        int extendsize = (EVENT_RcvBuffer[5] & 0xff | (EVENT_RcvBuffer[6] << 8) & 0xff00) & 0xffff;                        //Util.UDebugMessage("EVENTReceiveMSGFunc: extend size : " + extendsize.ToString(),0,0);                        if (extendsize + 1 > EVENT_RcvBufferPos)                        {                            //short , next                            //Util.UDebugMessage("EVENTReceiveMSGFunc: short , next ",0,0);                            break;                        }                        else                        {                            //processing                            //처리할 패킷만큼 보낸다..                            byte[] cmdbuffer = new byte[extendsize + 1];                            Array.Copy(EVENT_RcvBuffer, cmdbuffer, extendsize + 1);                            EVENTRcvProcess(cmdbuffer, extendsize); //패킷처리                            //로그 처리 cmdbuffer, extendsiz                            if (_Data.Enable_Log == true)                            {                                string Data = String.Empty;                                for (int i = 0; i < extendsize; i++) // for (int i = 0; i < ReadBuffer.Length; i++)                                {                                    string value = Convert.ToString(cmdbuffer[i], 16);                                    if (value.Length == 1) value = "0" + value;                                    Data += value + " ";                                }                                _Event.Log_SendMessage_Write("[ Event ] [응답] " + Data);                                LFC.Log("[ Event ] [응답] " + Data);                            }                            else                            {                                string Data = String.Empty;                                for (int i = 0; i < extendsize; i++) // for (int i = 0; i < ReadBuffer.Length; i++)                                {                                    string value = Convert.ToString(cmdbuffer[i], 16);                                    if (value.Length == 1) value = "0" + value;                                    Data += value + " ";                                }                                LFC.Log("[ Event ] [응답] " + Data);                            }                            //처리한 패킷을 제거한다.                            Array.Copy(EVENT_RcvBuffer, extendsize + 1, EVENT_RcvBuffer, 0, EVENT_RcvBuffer.Length - extendsize - 1);                            EVENT_RcvBufferPos -= extendsize + 1;                            //Debug.WriteLine("EVENTReceiveMSGFunc: processing ");                            //EVENTRcvProcess(EVENT_RcvBuffer,extendsize);                            //Util.LogWrite(string.Format("EVENT_RcvBuffer:{0},Length:{1}", Util.ToHex(EVENT_RcvBuffer), extendsize));                            //EVENT_RcvBufferPos -= extendsize + 1;                        }                    }                    else if (EVENT_RcvBuffer[3] + 1 > EVENT_RcvBufferPos)                    {                        //short , next                        //Util.UDebugMessage("EVENTReceiveMSGFunc: short , next",0,0);                        break;                    }                    else                    {                        int extendsize = EVENT_RcvBuffer[3];                        //처리할 패킷만큼 보낸다..                        byte[] cmdbuffer = new byte[extendsize + 1];                        Array.Copy(EVENT_RcvBuffer, cmdbuffer, extendsize + 1);                        EVENTRcvProcess(cmdbuffer, extendsize); //패킷처리                        //로그 처리 cmdbuffer, extendsiz                        if (_Data.Enable_Log == true)                        {                            string Data = String.Empty;                            for (int i = 0; i < extendsize; i++) // for (int i = 0; i < ReadBuffer.Length; i++)                            {                                string value = Convert.ToString(cmdbuffer[i], 16);                                if (value.Length == 1) value = "0" + value;                                Data += value + " ";                            }                            _Event.Log_SendMessage_Write("[ Event ] [응답] " + Data);                            LFC.Log("[ Event ] [응답] " + Data);                        }                        else                        {                            string Data = String.Empty;                            for (int i = 0; i < extendsize; i++) // for (int i = 0; i < ReadBuffer.Length; i++)                            {                                string value = Convert.ToString(cmdbuffer[i], 16);                                if (value.Length == 1) value = "0" + value;                                Data += value + " ";                            }                            LFC.Log("[ Event ] [응답] " + Data);                        }                        //처리한 패킷을 제거한다.                        Array.Copy(EVENT_RcvBuffer, extendsize + 1, EVENT_RcvBuffer, 0, EVENT_RcvBuffer.Length - extendsize - 1);                        EVENT_RcvBufferPos -= extendsize + 1;                        ////processing                        //Debug.WriteLine("EVENTReceiveMSGFunc: size : " + EVENT_RcvBuffer[3].ToString());                        //Debug.WriteLine("EVENTReceiveMSGFunc: processing" + EVENT_RcvBuffer[3].ToString());                        //int extendsize = EVENT_RcvBuffer[3];                        //EVENTRcvProcess(EVENT_RcvBuffer, extendsize);                        //Util.LogWrite(string.Format("EVENT_RcvBuffer:{0},Length:{1}", Util.ToHex(EVENT_RcvBuffer), extendsize));                        //EVENT_RcvBufferPos -= extendsize + 1;                    }                }                else                {                    // header error                    Util.LogWrite(string.Format("EVENTReceiveMSGFunc header error {0}", Util.ToHex(EVENT_RcvBuffer)));    //명령 로그에 저장                    //Debug.WriteLine("EVENTReceiveMSGFunc: header error : " + EVENT_RcvBuffer[0].ToString());                    for (int i = 0; i < 3072; i++)                    {                        //init buffer                        //EVENT_RcvBuffer[i] = 0x00;                        //다음 헤더를 찾는다..                        if (EVENT_RcvBuffer[i] == 0x02)                        {                            //헤더를 찾은위치 이전까지 버린다.                            int extendsize = i - 1;                            //처리한 패킷을 제거한다.                            Array.Copy(EVENT_RcvBuffer, extendsize + 1, EVENT_RcvBuffer, 0, EVENT_RcvBuffer.Length - extendsize - 1);                            EVENT_RcvBufferPos -= extendsize + 1;                            break;                        }                    }                    //for (int i = 0; i < 3072; i++)                    //{//init buffer                    //    EVENT_RcvBuffer[i] = 0x00;                    //}                    //EVENT_RcvBufferPos = 0;                    break;                }            }        }        string ToHex(byte[] bin_data)        {// byte to hex function             string result = "";            try            {                foreach (byte ch in bin_data)                {                    result += string.Format("{0:x2} ", ch);                }            }            catch (Exception ex)            {                Util.UErrorMessage(ex, 0, 0);            }            return result;        }        string ToHex(byte[] bin_data, int len)        {// multiple byte to hex             string result = "";            try            {                for (int i = 0; i < len; i++)                {                    result += string.Format("{0:x2} ", bin_data[i]);                }            }            catch (Exception ex)            {                Util.UErrorMessage(ex, 0, 0);            }            return result;        }    }}
 |