public static void Disconnect() { status = BridgeStatus.Offline; form.Invoke(new Action(() => form.listBoxPlayers.Items.Clear())); form.Invoke(new Action(() => form.OnLogout())); LingerOption lingerOption = new LingerOption(true, 0); try { udpToServer.Close(); udpToServer = null; } catch { } try { tcpToServer.LingerState = lingerOption; tcpToServer.Client.Close(); tcpToServer.Close(); udpToServer = null; } catch { } try { tcpToClient.LingerState = lingerOption; tcpToClient.Client.Close(); tcpToClient.Close(); udpToServer = null; } catch { } dynamicEntities.Clear(); }
public static void Logout() { swriter.Write((byte)ServerPacketID.Logout); if (status == BridgeStatus.Playing) { tcpToClient.Close(); } status = BridgeStatus.Connected; }
public static void Connect() { form.Log("connecting...", Color.DarkGray); string serverIP = Config.serverIP; int serverPort = Config.serverPort; try { tcpToServer = new TcpClient(); tcpToServer.Connect(serverIP, serverPort); udpToServer = new UdpClient(tcpToServer.Client.LocalEndPoint as IPEndPoint); udpToServer.Connect(serverIP, serverPort); SendUDP(new byte[1] { (byte)DatagramID.HolePunch }); } catch (SocketException) {//connection refused Disconnect(); form.Log("failed\n", Color.Red); var result = MessageBox.Show("Unable to connect to Exceed. Please try again later.", "Connection Error", MessageBoxButtons.RetryCancel); if (result == DialogResult.Retry) { Connect(); } return; } Stream stream = tcpToServer.GetStream(); swriter = new BinaryWriter(stream); sreader = new BinaryReader(stream); form.Log("connected\n", Color.Green); new Thread(new ThreadStart(ListenFromServerTCP)).Start(); status = BridgeStatus.Connected; form.Log("checking version...", Color.DarkGray); swriter.Write((byte)0);//packetID swriter.Write(Config.bridgeVersion); }
private static void ProcessServerPacket(int packetID) { switch ((ServerPacketID)packetID) { case ServerPacketID.VersionCheck: #region VersionCheck if (!sreader.ReadBoolean()) { form.Log("mismatch\n", Color.Red); var b = MessageBox.Show("your bridge is outdated. Please download the newest version.\n\nGo to download page now?", "version mismatch", MessageBoxButtons.YesNo); if (b == DialogResult.Yes) { System.Diagnostics.Process.Start("https://github.com/LastExceed/Exceed/releases"); } return; } form.Log("match\n", Color.Green); form.Invoke(new Action(() => form.buttonLoginRegister.Enabled = true)); new Thread(new ThreadStart(ListenFromServerUDP)).Start(); break; #endregion case ServerPacketID.Login: #region Login var authResponse = (AuthResponse)sreader.ReadByte(); if (authResponse == AuthResponse.Success) { status = BridgeStatus.LoggedIn; guid = sreader.ReadUInt16(); mapseed = sreader.ReadInt32(); } form.Invoke(new Action(() => form.register.OnLoginResponse(authResponse))); break; #endregion case ServerPacketID.Register: #region Register switch ((RegisterResponse)sreader.ReadByte()) { case RegisterResponse.Success: form.Log("account registered\n", Color.DarkGray); form.Invoke(new Action(() => form.register.SetLayout(false))); break; case RegisterResponse.UsernameTaken: MessageBox.Show("this username is already in use"); form.Invoke(new Action(() => form.register.buttonRegister.Enabled = true)); break; case RegisterResponse.EmailTaken: MessageBox.Show("there is already an account associated to this email"); form.Invoke(new Action(() => form.register.buttonRegister.Enabled = true)); break; } break; #endregion case ServerPacketID.Kick: #region Kick status = BridgeStatus.LoggedIn; tcpToClient.Close(); break; #endregion case ServerPacketID.BTFO: #region BTFO status = BridgeStatus.Connected; form.Invoke(new Action(() => form.OnLogout())); CwRam.memory.process.Kill(); var reason = sreader.ReadString(); MessageBox.Show(reason); break; #endregion default: MessageBox.Show("unknown server packet received"); break; } }
public static void ListenFromClientTCP() { try { tcpListener.Start(); } catch (SocketException ex) { var result = MessageBox.Show(ex.Message + "\n\nCan't start listening for the client, probably because the CubeWorld default port (12345) is already in use by another program. Do you have a CubeWorld server or another instance of the bridge already running on your computer?\n\nIf you don't know how to fix this, restarting your computer will likely help", "Error", MessageBoxButtons.RetryCancel); if (result == DialogResult.Retry) { ListenFromClientTCP(); } return; } while (true) { tcpToClient = tcpListener.AcceptTcpClient(); form.Log("client connected\n", Color.Green); tcpToClient.ReceiveTimeout = 500; tcpToClient.SendTimeout = 500; tcpToClient.NoDelay = true; Stream stream = tcpToClient.GetStream(); creader = new BinaryReader(stream); cwriter = new BinaryWriter(stream); if (status != BridgeStatus.LoggedIn) { SendToClient(new ProtocolVersion() { version = 42069, }); form.Log("client rejected\n", Color.Red); continue; } status = BridgeStatus.Playing; try { while (true) { ProcessClientPacket(creader.ReadInt32()); } } catch (ObjectDisposedException) { } catch (IOException) { } tcpToClient.Close(); switch (status) { case BridgeStatus.Offline: //server crashed break; case BridgeStatus.Connected: //player logged out break; case BridgeStatus.LoggedIn: //kicked goto default; case BridgeStatus.Playing: //client disconnected himself status = BridgeStatus.LoggedIn; SendUDP(new RemoveDynamicEntity() { Guid = guid }.data); break; default: //this shouldnt happen break; } dynamicEntities.Remove(guid); form.Log("client disconnected\n", Color.Red); RefreshPlayerlist(); } }