示例#1
0
        internal void ReceiveDataAndEnqueue()
        {
            log.Context = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName + "." + System.Reflection.MethodBase.GetCurrentMethod().Name;
            log.WriteLog("ReceiveData and Enqueue thread started...");
            string s;
            int iCRat, iCRcount;
            string [] sa;
            int length = 0;
            string sLastErrorMessage = "";
            while (!m_bDone)
            {
                try
                {

                    try
                    {
                        m_NetworkStream = m_TCPClient.GetStream();
                        System.IAsyncResult asr = m_NetworkStream.BeginRead(m_bytesIncomingBuffer,m_iBufferLength,m_iBufferMaxLength -
                            m_iBufferLength,null,null);
                        while (!asr.IsCompleted && !m_bDone)
                        {
                            System.Threading.Thread.Sleep(100);
                        }
                        if (m_bDone)
                        {
                            continue;
                        }
                        //asr.AsyncWaitHandle.WaitOne();
                        length = m_NetworkStream.EndRead(asr);
                    }
                    catch (System.IO.IOException ioex)
                    {
                        if (null != ioex.InnerException)
                        {
                            if (ioex.InnerException is System.Net.Sockets.SocketException)
                            {
                                int iErrorCode = ((System.Net.Sockets.SocketException)ioex.InnerException).ErrorCode;

                                string sErrorMessage = ((System.Net.Sockets.SocketException)ioex.InnerException).Message;
                                sLastErrorMessage = "ReceiveDataAndEnqueue: Error Code = " + iErrorCode.ToString() + " Description = " + sErrorMessage;

                            }
                            else
                            {
                                sLastErrorMessage = "ReceiveDataAndEnqueue: Unknown Error detected. Description = " + ioex.Message;
                            }
                            log.WriteLog(sLastErrorMessage);
                        }
                        m_bDone = true;
                        m_bConnected = false;
                    }
                    catch (System.Exception ex)
                    {
                        sLastErrorMessage = "ReceiveDataAndEnqueue: Unknown Error detected. Description = " + ex.Message;
                        log.WriteLog(sLastErrorMessage);
                        m_bDone = true;
                        m_bConnected = false;
                    }

                    if(!m_bConnected)
                    {
                        OnConnectionErrorReceived(this,sLastErrorMessage);
                        continue;
                    }
                    if (m_bDone)
                        continue;

                    if (0 == length)
                    {	// connection must have been reset
                        m_bDone = true;
                        m_bConnected = false;
                        continue;
                    }

                    m_iBufferLength += length;

                    // find all the messages in the stream
                    iCRcount = 0;
                    for (int i = 0; i < m_iBufferLength; i++)
                    {
                        if (m_bytesIncomingBuffer[i] == 13)
                            iCRcount++;
                    }	// for
                    // post all messages from the stream
                    for (int i = 0; i < iCRcount; i++)
                    {
                        s = System.Text.Encoding.ASCII.GetString(m_bytesIncomingBuffer);
                        s = s.Substring(0,m_iBufferLength);

                        iCRat = s.IndexOf((char)13);
                        if (-1 != iCRat)
                        {
                            int iLen;
                            s = s.Substring(0,iCRat);
                            iLen = s.Length + 1;
                            m_iBufferLength -= iLen;
                            m_sLastResponse = s;

                            lock (m_qCommands.SyncRoot)
                            {
                                OysterEncoder.Command cmd;
                                string [] saParams;
                                sa = OysterEncoder.Command.DecodeCommand(System.Text.Encoding.ASCII.GetBytes(s),s.Length);
                                if (sa.Length > 1)
                                {
                                    saParams = new string[sa.Length - 1];
                                    Array.Copy(sa,1,saParams,0,sa.Length - 1);
                                    cmd = new OysterEncoder.Command(sa[0],saParams);
                                }
                                else
                                {
                                    cmd = new OysterEncoder.Command(sa[0],null);
                                }
                                m_qCommands.Enqueue(cmd);
                            }
                            byte [] bytes = new byte[m_iBufferLength];
                            Array.Copy(m_bytesIncomingBuffer,0,bytes,0,m_iBufferLength);
                            OysterEncoder.CommandEventArgs cea = new OysterEncoder.CommandEventArgs(bytes, ref m_qCommands);
                            OnMessageReceived(cea);
                            m_EventMessageAvailable.Set();
                            Array.Copy(m_bytesIncomingBuffer,iLen,m_bytesIncomingBuffer,0,m_iBufferLength);
                            Array.Clear(m_bytesIncomingBuffer,m_iBufferLength,m_iBufferMaxLength - m_iBufferLength);
                        }	// if
                    }	// for
                }
                catch (System.Exception ex)
                {
                    log.WriteLog("Exception: " + ex.Message);
                }
            }	// while

            m_EventThreadComplete.Set();
        }
示例#2
0
 public static OysterEncoder.Command CommandFromString(string CommandAsString)
 {
     OysterEncoder.Command cmd;
     string [] sa;
     string [] saParams;
     sa = OysterEncoder.Command.DecodeCommand(System.Text.Encoding.ASCII.GetBytes(CommandAsString),CommandAsString.Length);
     if (sa.Length > 1)
     {
         saParams = new string[sa.Length - 1];
         Array.Copy(sa,1,saParams,0,sa.Length - 1);
         cmd = new OysterEncoder.Command(sa[0],saParams);
     }
     else
     {
         cmd = new OysterEncoder.Command(sa[0],null);
     }
     return cmd;
 }