Beispiel #1
0
 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;
            }
        }