コード例 #1
0
ファイル: BridgeTCPUDP.cs プロジェクト: nonozelmar/Exceed
        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();
        }
コード例 #2
0
ファイル: BridgeTCPUDP.cs プロジェクト: nonozelmar/Exceed
 public static void Logout()
 {
     swriter.Write((byte)ServerPacketID.Logout);
     if (status == BridgeStatus.Playing)
     {
         tcpToClient.Close();
     }
     status = BridgeStatus.Connected;
 }
コード例 #3
0
ファイル: BridgeTCPUDP.cs プロジェクト: nonozelmar/Exceed
        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);
        }
コード例 #4
0
ファイル: BridgeTCPUDP.cs プロジェクト: nonozelmar/Exceed
        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;
            }
        }
コード例 #5
0
ファイル: BridgeTCPUDP.cs プロジェクト: nonozelmar/Exceed
        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();
            }
        }