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)); }
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); }
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(); } }
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(); } }