void m_Connection_ReceiveData(object sender, ConnectionReceiveDataEventArgs e)
        {
            //Log.WriteLog(Log.LogLevelType.Comm, "CommandInterface::ReceiveData(): " +
            //    "[" + m_Connection.Address + ":" + m_Connection.Port + "] " +
            //    "Received " + e.Length.ToString() + " bytes");
            //Log.HexDump(Log.LogLevelType.Comm, e.Buffer);

            // Append incoming Data to Global Recv Buffer
            if (ReceiveBuffer == null)
            {
                ReceiveBuffer = e.Buffer;
            }
            else
            {
                int OldLength = ReceiveBuffer.Length;
                Array.Resize(ref ReceiveBuffer, ReceiveBuffer.Length + e.Buffer.Length);
                Array.Copy(e.Buffer, 0, ReceiveBuffer, OldLength, e.Buffer.Length);
            }

            byte[] WorkBuffer = null;

            while (GetMessage(ref WorkBuffer) == true)
            {
                ParseMessage(WorkBuffer);
            }
        }
示例#2
0
        protected virtual void OnReceiveData(ConnectionReceiveDataEventArgs e)
        {
            var handler = ReceiveData;

            if (handler != null)
            {
                handler(this, e);
            }
        }
示例#3
0
        private void ReceiveCallback(IAsyncResult ar)
        {
            // Retrieve the state object and the client socket
            // from the asynchronous state object.
            StateObject state  = (StateObject)ar.AsyncState;
            Socket      client = state.WorkSocket;
            SocketError error;
            int         bytesRead;

            //ensure current client connection is the same as
            //the one contained in the callback object
            if (client != ClientSocket)
            {
                return;
            }

            if (ClientSocket == null)
            {
                return;
            }

            if (Connected == false)
            {
                return;
            }


            System.Threading.Monitor.Enter(countLock);

            //Read data from the remote device.
            try
            {
                bytesRead = client.EndReceive(ar, out error);
            }
            catch (SocketException e)
            {
                System.Threading.Monitor.Exit(countLock);

                ConnectionErrorEventArgs args = new ConnectionErrorEventArgs();
                args.ConnectionID = m_ID;
                args.ErrorCode    = e.ErrorCode;
                args.ErrorMessage = e.Message;
                OnError(args);

                Disconnect();
                return;
            }
            catch (Exception)
            {
                Disconnect();
                return;
            }

            if ((bytesRead == 0) || (error != SocketError.Success))
            {
                System.Threading.Monitor.Exit(countLock);

                if (error != SocketError.Success)
                {
                    ConnectionErrorEventArgs args = new ConnectionErrorEventArgs();
                    args.ConnectionID = m_ID;
                    args.ErrorCode    = (int)error;
                    args.ErrorMessage = "Disconnect: Bytes = " + bytesRead.ToString() + ", Error = " + error.ToString();
                    OnError(args);
                }

                Disconnect();
                return;
            }

            Byte[] buffer = null;

            if (bytesRead > 0)
            {
                buffer = new Byte[bytesRead];
                Array.Copy(state.buffer, buffer, bytesRead);
            }

            System.Threading.Monitor.Exit(countLock);

            if (bytesRead > 0)
            {
                ConnectionReceiveDataEventArgs RecvArgs = new ConnectionReceiveDataEventArgs();
                RecvArgs.ConnectionID = m_ID;
                RecvArgs.Buffer       = buffer;
                RecvArgs.Length       = bytesRead;
                OnReceiveData(RecvArgs);
            }


            //invoke could trigger disconnect (or disconnect via send()),
            //which means our socket could be invalid
            if (client != ClientSocket)
            {
                return;
            }

            if (ClientSocket == null)
            {
                return;
            }

            if (Connected == false)
            {
                return;
            }


            //Get the rest of the data.
            try
            {
                client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
            }
            catch (SocketException e)
            {
                // ConnectionErrorEventArgs args = new ConnectionErrorEventArgs();
                // args.ConnectionID = m_ID;
                // args.ErrorCode = e.ErrorCode;
                // args.ErrorMessage = e.Message;
                // OnError(args);

                Disconnect();
                return;
            }
            catch (Exception)
            {
                Disconnect();
                return;
            }
        }