public void Send(MessageType type, int level, string group, string message) { walker.Buffer.Clear(); walker.Cursor = 0; walker.Put((byte)NetClient.PackageType.TraceMessage); walker.Put((int)type); walker.Put(level); walker.Put(string.Format("[{0}]", message)); walker.Put(message); client.Send(walker.Buffer.ToArray()); }
public void Poll() { switch (state) { case State.Connecting: if (connectTask == null) { TryNextAddress(); } else if (connectTask.IsCompleted) { if (connectTask.IsCanceled || connectTask.IsFaulted) { TryNextAddress(); } else { state = (socket != null) && (destination != null) ? State.Connected : State.Idle; if (state == State.Connected) { connectTask = null; BinaryWalker walker = new BinaryWalker(); walker.Put((byte)PackageType.Identifier); walker.Put(Identifier); sendMutex.WaitOne(); Send(walker.Buffer.ToArray()); sendMutex.ReleaseMutex(); pingEnabled = true; lastReceivedPing = DateTime.Now; lastSentPing = DateTime.Now; Console.WriteLine("Client: Connected"); } else { Console.WriteLine("Client: Connection failed"); } } } break; case State.Connected: if (pingEnabled) { var time = DateTime.Now; if (time - lastSentPing > PING_INTERVAL) { lastSentPing = time; byte[] packet = new byte[5]; Buffer.BlockCopy(BitConverter.GetBytes(1), 0, packet, 0, 4); packet[4] = (byte)PackageType.Ping; Send(packet); } } if (sendTask != null) { if (sendTask.IsFaulted || sendTask.IsCanceled) { Console.WriteLine("Client: Error occurred while sending data."); // We are going to retry this send. sendTask = null; } else if (sendTask.IsCompleted) { sendTask = null; outbound.RemoveAt(0); } } else { sendMutex.WaitOne(); sendPackets(outbound); sendMutex.ReleaseMutex(); } if (recieveTask == null) { try { recieveTask = socket.ReceiveAsync(new ArraySegment <byte>(recieveBuffer), SocketFlags.None); } catch (SocketException err) { Console.WriteLine("Client: Error occurred while sending or receiving data."); Console.WriteLine(" Error: {0}", err.Message); } } else if (recieveTask.IsFaulted || recieveTask.IsCanceled) { recieveTask = null; } else if (recieveTask.IsCompleted) { var count = recieveTask.Result; BinaryWalker walker = new BinaryWalker(); walker.Cursor = 0; walker.Buffer = new ArraySegment <byte>(recieveBuffer, 0, count).ToList(); while (walker.TryReadInt(out var size)) { if (walker.Cursor + size > walker.Size) { break; } readPackage(walker.Buffer.GetRange(walker.Cursor, size)); walker.Cursor += size; } recieveTask = null; } if (pingEnabled && (DateTime.Now - lastReceivedPing) > PING_WAIT_TIME) { Close(); } break; default: break; } }