예제 #1
0
        /// <summary>
        /// Read incoming headers
        /// </summary>
        public static void ReceiveHeader()
        {
            while (true)
            {
                while (IsConnected)
                {
                    try
                    {
                        byte[] header = ReceiveData(4);
                        if (header.Length != 4)
                        {
                            IsConnected = false;
                            break;
                        }
                        else
                        {
                            int packetSize = BitConverter.ToInt32(header, 0);
                            if (packetSize > 0)
                            {
                                Console.WriteLine($"Android: packet size is {packetSize}");
                                byte[] payload = ReceiveData(packetSize);
                                if (payload.Length != packetSize)
                                {
                                    IsConnected = false;
                                    break;
                                }
                                else
                                {
                                    IPacket packet = Desirialize.PacketDesirialize(payload);
                                    Console.WriteLine($"Android: packet received is {packet.GetType().Name}");
                                    new Thread(delegate()
                                    {
                                        new ReadPacket(packet);
                                    }).Start();
                                }
                            }
                        }
                    }
                    catch (SocketException se)
                    {
                        Console.WriteLine(se.SocketErrorCode);
                        IsConnected = false;
                        break;
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                        IsConnected = false;
                        break;
                    }
                }

                while (!IsConnected)
                {
                    try
                    {
                        Socket?.Dispose();
                        KeepAlivePacket?.Dispose();

                        Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
                        {
                            ReceiveBufferSize = 50000,
                            SendBufferSize    = 50000,
                        };
                        Socket.Connect(Configuration.Host, Configuration.Port);
                        IsConnected = true;

                        Send(IdSender());
                        KeepAlivePacket = new Timer(Ping, null, new Random().Next(5000, 30000), new Random().Next(5000, 30000)); //random interval
                    }
                    catch (SocketException se)
                    {
                        Console.WriteLine(se.SocketErrorCode);
                        Thread.Sleep(new Random().Next(2000, 5000));
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                        Thread.Sleep(new Random().Next(2000, 5000));
                    }
                }
            }
        }
예제 #2
0
        /// <summary>
        /// Read incoming packets | Asynchronous
        /// docs.microsoft.com/en-us/dotnet/api/system.net.sockets.socket.endreceive?view=netframework-4.8
        /// </summary>
        private void ReceiveCall(IAsyncResult ar)
        {
            try
            {
                int received = Socket.EndReceive(ar);
                //Debug.WriteLine($"Server: received[{received}] offset[{Offset}]  size[{Size}]");
                Offset        += received;
                Size          -= received;
                BytesReceived += received;

                if (received > 0)
                {
                    switch (HeaderReceived)
                    {
                    case false:
                    {
                        if (Size == 0)
                        {
                            PayloadSize = BitConverter.ToInt32(Buffer, 0);
                            if (PayloadSize > 0)
                            {
                                Size   = PayloadSize;
                                Offset = 0;
                                Buffer = new byte[PayloadSize];
                                Socket.ReceiveBufferSize = Size;
                                BytesReceived            = 0;
                                HeaderReceived           = true;
                                Debug.WriteLine($"Server: packet size is {PayloadSize}");
                            }
                            else
                            {
                                PayloadSize = 0;
                                Size        = 4;
                                Offset      = 0;
                                Buffer      = new byte[Size];
                                Socket.ReceiveBufferSize = Size;
                                BytesReceived            = 0;
                            }
                        }
                        break;
                    }

                    case true:
                    {
                        if (Size == 0)
                        {
                            IPacket packet = Desirialize.PacketDesirialize(Buffer);
                            Debug.WriteLine($"Server: packet received is {packet.GetType().Name}");
                            ThreadPool.QueueUserWorkItem((o) =>
                                {
                                    new ReadPacket(this, packet);
                                });
                            PayloadSize = 0;
                            Size        = 4;
                            Offset      = 0;
                            Buffer      = new byte[Size];
                            Socket.ReceiveBufferSize = Size;
                            BytesReceived            = 0;
                            HeaderReceived           = false;
                        }
                        break;
                    }
                    }
                    Socket.BeginReceive(Buffer, Offset, Size, 0, ReceiveCall, null);
                }
                else
                {
                    Disconnected();
                    return;
                }
            }
            catch (SocketException se)
            {
                Debug.WriteLine(se.SocketErrorCode);
                Disconnected();
                return;
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
                Disconnected();
                return;
            }
        }
예제 #3
0
        /// <summary>
        /// Read incoming headers
        /// </summary>
        public static void ReceiveHeader()
        {
            while (true)
            {
                while (IsConnected)
                {
                    try
                    {
                        byte[] header = ReceiveData(4);
                        if (header.Length != 4)
                        {
                            IsConnected = false;
                            break;
                        }
                        else
                        {
                            int packetSize = BitConverter.ToInt32(header, 0);
                            if (packetSize > 0)
                            {
                                Debug.WriteLine($"Client: packet size is {packetSize}");
                                byte[] payload = ReceiveData(packetSize);
                                if (payload.Length != packetSize)
                                {
                                    IsConnected = false;
                                    break;
                                }
                                else
                                {
                                    IPacket packet = Desirialize.PacketDesirialize(payload);
                                    Debug.WriteLine($"Client: packet received is {packet.GetType().Name}");
                                    new Thread(delegate()
                                    {
                                        new ReadPacket(packet);
                                    }).Start();
                                }
                            }
                        }
                    }
                    catch (SocketException se)
                    {
                        Debug.WriteLine(se.SocketErrorCode);
                        IsConnected = false;
                        break;
                    }
                    catch (Exception ex)
                    {
                        Debug.WriteLine(ex.Message);
                        IsConnected = false;
                        break;
                    }
                }

                while (!IsConnected)
                {
                    try
                    {
                        Thread.Sleep(2000);

                        Socket?.Dispose();
                        KeepAlivePacket?.Dispose();

                        Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
                        {
                            ReceiveBufferSize = 50 * 1000,
                            SendBufferSize    = 50 * 1000,
                        };
                        Socket.Connect(Configuration.Host, Configuration.Port);
                        IsConnected = true;

                        Send(new PacketIdentification()
                        {
                            Type            = ClientType.PC,
                            Username        = Environment.UserName,
                            OperatingSystem = new ComputerInfo().OSFullName,
                            ID = Configuration.Id,
                        });
                        KeepAlivePacket = new Timer(Ping, null, new Random().Next(5000, 30000), new Random().Next(5000, 30000)); //random interval
                    }
                    catch (SocketException se)
                    {
                        Debug.WriteLine(se.SocketErrorCode);
                    }
                    catch (Exception ex)
                    {
                        Debug.WriteLine(ex.Message);
                    }
                }
            }
        }