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