using System; using System.Threading; using System.Net; using System.Net.Sockets; using Advantech.Adam; using Advantech.Common; namespace Advantech.Adam { /// /// Summary description for AdamEventServerThread. /// public class AdamEventServerThread { private Advantech.Common.UDPSocketServer m_UDPServer; private Advantech.Common.SocketStream m_SocketStream; private string[] m_strIP; private int m_iStatus; private AdamStreamRecList m_recList; private Thread m_UDPServerThread; private bool m_bStop; private byte[] m_byACK; private byte[] m_byQuery; private static int ADAM_THREAD_AVAILABLE = 0; private static int ADAM_THREAD_BUSY = 1; private static int ADAM_THREAD_IDX_EXIT = 0; //private static int ADAM_THREAD_IDX_SEND = 1; //private static int ADAM_THREAD_IDX_DONE = 2; //private static int ADAM_THREAD_IDX_ACK = 1; //private static int ADAM_THREAD_IDX_QUERY = 2; /// /// Constructer /// /// /// public AdamEventServerThread(ref AdamStreamRecList recList, string[] i_IP) { m_UDPServer = null; m_SocketStream = null; m_recList = recList; m_strIP = i_IP; m_bStop = false; CreateCmdArray(); m_iStatus = ADAM_THREAD_AVAILABLE; } private void CreateCmdArray() { int cmdLen = 8; //ACK command cmdLen = 8; m_byACK = new byte[cmdLen]; m_byACK[0]=Convert.ToByte('M'); m_byACK[1]=Convert.ToByte('A'); m_byACK[2]=Convert.ToByte('D'); m_byACK[3]=Convert.ToByte('A'); m_byACK[4]=0x02; m_byACK[5]=Convert.ToByte('A'); m_byACK[6]=Convert.ToByte('C'); m_byACK[7]=Convert.ToByte('K'); //Query command cmdLen = 10; m_byQuery = new byte[cmdLen]; m_byQuery[0]=Convert.ToByte('M'); m_byQuery[1]=Convert.ToByte('A'); m_byQuery[2]=Convert.ToByte('D'); m_byQuery[3]=Convert.ToByte('A'); m_byQuery[4]=0x02; m_byQuery[5]=Convert.ToByte('Q'); m_byQuery[6]=Convert.ToByte('U'); m_byQuery[7]=Convert.ToByte('E'); m_byQuery[8]=Convert.ToByte('R'); m_byQuery[9]=Convert.ToByte('Y'); } /// /// Start server thread /// public void StartThread() { if (m_UDPServerThread == null) { m_bStop = false; m_UDPServerThread = new System.Threading.Thread(new ThreadStart(this.ThreadMemberFunc)); m_UDPServerThread.Start(); } } /// /// Stop server thread /// /// public bool StopThread() { if (m_UDPServerThread != null) { m_bStop = true; m_UDPServerThread.Abort(); while (m_iStatus != ADAM_THREAD_IDX_EXIT) { Thread.Sleep(10); } m_UDPServerThread = null; } return true; } private void ThreadMemberFunc() { int[] cntQuery = new int[m_strIP.Length]; int cntRetry = 0; int i; byte[] recvBuf = new byte[(int)ADAM_EVENT.MAX_RECV_BUFF_LEN]; int recvLen; IPAddress ipAddress; byte[] byIP = null; IPEndPoint remoteIPEP; EndPoint remoteEP; m_UDPServer = new UDPSocketServer(); try { m_UDPServer.Create((int)ADAM_EVENT.IN_PORT); Socket sk = m_UDPServer.ServerSocket(); m_SocketStream = new SocketStream(ref sk, m_UDPServer.SendTimeout, m_UDPServer.ReceiveTimeout); m_iStatus = ADAM_THREAD_AVAILABLE; //First Query //Send Query Cmd EndPoint remoteEP_Query_First; IPEndPoint[] remoteIPEP_Query_First = new IPEndPoint[m_strIP.Length]; for(i=0;i 100) cntQuery[i] = 2; if (cntQuery[i] > 2) // retry more than 2 times { IPAddress ipTemp; ipTemp = IPAddress.Parse(this.m_strIP[i]); byIP = ipTemp.GetAddressBytes(); m_recList.PushEventRec(byIP, 0, 0, (int)EVENT_TYPE.CONNECT, (int)EVENT_STATUS.LOST, 0); } //Send Query Cmd EndPoint remoteEP_Query; IPEndPoint remoteIPEP_Query = new IPEndPoint(IPAddress.Parse(this.m_strIP[i]), (int)ADAM_EVENT.OUT_PORT); remoteEP_Query = (EndPoint)remoteIPEP_Query; m_SocketStream.SendUDP(ref remoteEP_Query, m_byQuery, m_byQuery.Length); } } } catch(ThreadAbortException exAbort) { string strTemp = exAbort.Message; m_SocketStream = null; if(m_UDPServer!=null) { m_UDPServer.Terminate(); m_UDPServer = null; } m_iStatus = ADAM_THREAD_IDX_EXIT; break; } catch(Exception ex) { System.Windows.Forms.MessageBox.Show("Exception:"+ex.ToString()+"\nThe server will terminate!"); m_SocketStream = null; if(m_UDPServer!=null) { m_UDPServer.Terminate(); m_UDPServer = null; } m_iStatus = ADAM_THREAD_IDX_EXIT; break; } } m_SocketStream = null; if(m_UDPServer!=null) { m_UDPServer.Terminate(); m_UDPServer = null; } m_iStatus = ADAM_THREAD_IDX_EXIT; } } }