Beispiel #1
0
        public DateTime ValueAsDateTime()
        {
            long seconds = 0;

            if (_Length == 1)
            {
                seconds = _Value[0];
            }
            else if (_Length == 2)
            {
                seconds = NetworkByteOrderConverter.ToInt16(_Value, 0);
            }
            else if (_Length == 3)
            {
                byte[] buffer = new byte[4];
                Buffer.BlockCopy(_Value, 0, buffer, 1, 3);
                seconds = NetworkByteOrderConverter.ToInt32(buffer, 0);
            }
            else if (_Length == 4)
            {
                seconds = NetworkByteOrderConverter.ToInt32(_Value, 0);
            }
            else if (_Length == 8)
            {
                seconds = NetworkByteOrderConverter.ToInt64(_Value, 0);
            }
            else
            {
                throw new InvalidCastException();
            }
            return(_Epoch.AddSeconds(seconds));
        }
Beispiel #2
0
        public long ValueAsInt64()
        {
            long result;

            if (_Length == 1)
            {
                result = _Value[0];
            }
            else if (_Length == 2)
            {
                result = NetworkByteOrderConverter.ToInt16(_Value, 0);
            }
            else if (_Length == 4)
            {
                result = NetworkByteOrderConverter.ToInt32(_Value, 0);
            }
            else if (_Length == 8)
            {
                result = NetworkByteOrderConverter.ToInt64(_Value, 0);
            }
            else
            {
                throw new InvalidCastException();
            }
            return(result);
        }
Beispiel #3
0
        public static IPCRequest Deserialise(Stream stream)
        {
            IPCRequest result = new IPCRequest();
            int        length = NetworkByteOrderConverter.ToInt32(stream);

            byte[] buffer = new byte[length];
            stream.Read(buffer, 0, length);
            result.Method        = Encoding.UTF8.GetString(buffer);
            result.RequestNumber = NetworkByteOrderConverter.ToInt32(stream);
            stream.CopyTo(result._Payload);
            result._Payload.Position = 0;
            return(result);
        }
        private void DoReceiveCallback(IAsyncResult asyncResult)
        {
            ReceiveStateObject stateObject = asyncResult.AsyncState as ReceiveStateObject;

            try
            {
                int  readCount       = stateObject.Client.EndReceive(asyncResult);
                bool continueReceive = true;
                if (readCount > 0)
                {
                    stateObject.Data.Write(stateObject.Buffer, 0, readCount);
                    if ((stateObject.RequestLength == 0) && (stateObject.Data.Length > 4))
                    {
                        long position = stateObject.Data.Position;
                        stateObject.Data.Position = 0;
                        stateObject.RequestLength = NetworkByteOrderConverter.ToInt32(stateObject.Data) + 4;
                        stateObject.Data.Position = position;
                    }
                    if (stateObject.RequestLength == stateObject.Data.Position)
                    {
                        stateObject.Data.Position = 4;
                        IPCRequest request = IPCRequest.Deserialise(stateObject.Data);
                        ThreadPool.QueueUserWorkItem(new WaitCallback((s) => { ProcessRequest(stateObject.Client, request); }));
                        stateObject.Data.Position = 0;
                        stateObject.Data.SetLength(0);
                        stateObject.RequestLength = 0;
                    }
                }
                else
                {
                    if (stateObject.Client.ReceiveTimeout <= 0)
                    {
                        continueReceive = false;
                    }
                    else
                    {
                        TimeSpan diff = DateTime.Now.Subtract(stateObject.StartReceive);
                        if (diff.TotalMilliseconds < stateObject.Client.ReceiveTimeout)
                        {
                            continueReceive = false;
                        }
                    }
                }
                if (continueReceive)
                {
                    stateObject.StartReceive = DateTime.Now;
                    SocketError socketError;
                    stateObject.Client.BeginReceive(stateObject.Buffer, 0, ReceiveStateObject.BufferSize, SocketFlags.None, out socketError, new AsyncCallback(DoReceiveCallback), stateObject);
                }
                else
                {
                    stateObject.Client.Close();
                }
            }
#pragma warning disable 0168
            catch (Exception ex)
#pragma warning restore 0168
            {
                stateObject.Client.Close();
            }
        }
Beispiel #5
0
        private void ReceiveCallback(IAsyncResult asyncResult)
        {
            ReceiveStateObject stateObject = asyncResult.AsyncState as ReceiveStateObject;

            try
            {
                int  readCount       = stateObject.Client.EndReceive(asyncResult);
                bool continueReceive = true;
                if (readCount > 0)
                {
                    stateObject.Data.Write(stateObject.Buffer, 0, readCount);
                    if ((stateObject.RequestLength == 0) && (stateObject.Data.Length >= 4))
                    {
                        long position = stateObject.Data.Position;
                        stateObject.Data.Position = 0;
                        int requestLength = NetworkByteOrderConverter.ToInt32(stateObject.Data);
                        stateObject.RequestLength = Math.Abs(requestLength) + 4;
                        stateObject.Error         = requestLength < 0;
                        stateObject.Data.Position = position;
                    }
                    if (stateObject.RequestLength == stateObject.Data.Position)
                    {
                        _ErrorResponse            = stateObject.Error;
                        _ResponseBytes            = new byte[stateObject.RequestLength - 4];
                        stateObject.Data.Position = 4;
                        stateObject.Data.Read(_ResponseBytes, 0, _ResponseBytes.Length);
                        stateObject.Data.Position = 0;
                        stateObject.Data.SetLength(0);
                        stateObject.RequestLength = 0;
                        _ResponseWaitHandle.Set();
                    }
                }
                else
                {
                    if (stateObject.Client.ReceiveTimeout <= 0)
                    {
                        continueReceive = false;
                    }
                    else
                    {
                        TimeSpan diff = DateTime.Now.Subtract(stateObject.StartReceive);
                        if (diff.TotalMilliseconds < stateObject.Client.ReceiveTimeout)
                        {
                            continueReceive = false;
                        }
                    }
                }
                if (continueReceive)
                {
                    stateObject.StartReceive = DateTime.Now;
                    SocketError socketError;
                    stateObject.Client.BeginReceive(stateObject.Buffer, 0, ReceiveStateObject.BufferSize, SocketFlags.None, out socketError, _ReceiveCallback, stateObject);
                }
                else
                {
                    _Connected = false;
                    _ResponseWaitHandle.Set();
                    stateObject.Client.Close();
                }
            }
#pragma warning disable 168
            catch (Exception ex)
#pragma warning restore 168
            {
                _Connected = false;
                _ResponseWaitHandle.Set();
                stateObject.Client.Close();
            }
        }