Ignore:
Timestamp:
Sep 9, 2014, 8:04:37 PM (10 years ago)
Author:
alloc
Message:

fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • binary-improvements/7dtd-server-fixes/src/NetConnections/Servers/Telnet/TelnetConnection.cs

    r174 r182  
    11using System;
     2using System.Collections.Generic;
     3using System.IO;
    24using System.Net;
    35using System.Net.Sockets;
    46using System.Text;
     7using System.Threading;
    58
    69namespace AllocsFixes.NetConnections.Servers.Telnet
     
    811        public class TelnetConnection : IConnection
    912        {
     13                BlockingQueue<string> toClientQueue = new BlockingQueue<string> ();
     14                private Thread receiveThread = null;
     15                private Thread sendThread = null;
    1016                private bool authenticated = false;
    1117                private bool authEnabled;
    1218                private TcpClient client;
    1319                private NetworkStream stream;
    14                 private int lineBufferLength = 0;
    15                 private byte[] lineBuffer = new byte[200];
    1620                private EndPoint endpoint;
    1721
     
    2226                        this.stream = client.GetStream ();
    2327                        this.endpoint = client.Client.RemoteEndPoint;
     28
     29                        Log.Out ("Telnet connection from: " + endpoint);
     30
     31                        receiveThread = ThreadMaster.Create ("TelnetClientReceive", new ThreadStart (ReceiveThread));
     32                        receiveThread.Start ();
     33                        sendThread = ThreadMaster.Create ("TelnetClientSend", new ThreadStart (SendThread));
     34                        sendThread.Start ();
     35
     36                        if (authEnabled) {
     37                                WriteLine ("Please enter password:");
     38                        } else {
     39                                LoginMessage ();
     40                        }
    2441                }
    2542
    26                 public EndPoint GetEndPoint ()
     43                private void LoginMessage ()
    2744                {
    28                         return endpoint;
     45                        WriteLine ("*** Connected with 7DTD server.");
     46                        WriteLine ("*** Dedicated server only build");
     47                        WriteLine ("*** Allocs server fixes loaded");
     48                        WriteLine (string.Empty);
     49                        WriteLine ("Server IP:   " +
     50                                ((GamePrefs.GetString (EnumGamePrefs.ServerIP) != null && GamePrefs.GetString (EnumGamePrefs.ServerIP).Length != 0) ? GamePrefs.GetString (EnumGamePrefs.ServerIP) : "Any")
     51                        );
     52                        WriteLine ("Server port: " + GamePrefs.GetInt (EnumGamePrefs.ServerPort));
     53                        WriteLine ("Max players: " + GamePrefs.GetInt (EnumGamePrefs.ServerMaxPlayerCount));
     54                        WriteLine ("Game mode:   " + GamePrefs.GetString (EnumGamePrefs.GameMode));
     55                        WriteLine ("World:       " + GamePrefs.GetString (EnumGamePrefs.GameWorld));
     56                        WriteLine ("Game name:   " + GamePrefs.GetString (EnumGamePrefs.GameName));
     57                        WriteLine ("Difficulty:  " + GamePrefs.GetInt (EnumGamePrefs.GameDifficulty));
     58                        WriteLine (string.Empty);
     59                        WriteLine ("Press 'help' to get a list of all commands. Press 'exit' to end session.");
     60                        WriteLine (string.Empty);
    2961                }
    3062
    31                 private void WriteByte (byte v)
     63                private void ReceiveThread ()
    3264                {
    33                         if (!IsClosed () && stream.CanWrite) {
    34                                 stream.WriteByte (v);
     65                        try {
     66                                StreamReader reader = new StreamReader (stream);
     67                                try {
     68                                        while (!IsClosed()) {
     69                                                string line = reader.ReadLine ();
     70                                                if (line != null) {
     71                                                        line = line.Trim ();
     72
     73                                                        if (!IsAuthenticated ()) {
     74                                                                if (line.Equals (GamePrefs.GetString (EnumGamePrefs.TelnetPassword))) {
     75                                                                        authenticated = true;
     76                                                                        WriteLine ("Logon successful.");
     77                                                                        WriteLine (string.Empty);
     78                                                                        WriteLine (string.Empty);
     79                                                                        WriteLine (string.Empty);
     80                                                                        LoginMessage ();
     81                                                                } else {
     82                                                                        WriteLine ("Password incorrect, please enter password:");
     83                                                                }
     84                                                        } else {
     85                                                                if (line.ToLower ().Equals ("exit")) {
     86                                                                        Log.Out ("Telnet connection closed by client: " + endpoint);
     87                                                                        Close ();
     88                                                                        break;
     89                                                                }
     90                                                                Log.Out ("Telnet executed \"" + line + "\" from: " + endpoint);
     91                                                                ConsoleOutputSeparator.QueueNetCommand (line, this);
     92                                                        }
     93                                                }
     94                                        }
     95                                } catch (IOException) {
     96                                } catch (ThreadInterruptedException) {
     97                                }
     98                                ThreadMaster.Remove (Thread.CurrentThread.Name);
     99                        } catch (Exception ex) {
     100                                Log.Out ("Error in TelnetClientReceive: " + ex);
    35101                        }
     102
     103                }
     104
     105                private void SendThread ()
     106                {
     107                        try {
     108                                while (!IsClosed() && stream.CanWrite) {
     109                                        try {
     110                                                string line = toClientQueue.Dequeue ();
     111                                                if (!IsClosed () && stream.CanWrite) {
     112                                                        byte[] utfData = Encoding.UTF8.GetBytes (line);
     113                                                        stream.Write (utfData, 0, utfData.Length);
     114                                                        stream.WriteByte (13);
     115                                                        stream.WriteByte (10);
     116                                                }
     117                                        } catch (IOException) {
     118                                        } catch (ThreadInterruptedException) {
     119                                        } catch (Exception e) {
     120                                                Log.Out ("Error writing to client: " + e);
     121                                        }
     122                                }
     123
     124                                ThreadMaster.Remove (Thread.CurrentThread.Name);
     125                        } catch (Exception ex) {
     126                                Log.Out ("Error in TelnetClientSend: " + ex);
     127                        }
     128
    36129                }
    37130
    38131                public void WriteLine (string s)
    39132                {
    40                         try {
    41                                 if (!IsClosed () && stream.CanWrite) {
    42                                         byte[] utfData = Encoding.UTF8.GetBytes (s);
    43                                         stream.Write (utfData, 0, utfData.Length);
    44                                         WriteByte (13);
    45                                         WriteByte (10);
    46                                 }
    47                         } catch (Exception e) {
    48                                 Log.Out ("Error writing to client: " + e);
    49                         }
     133                        toClientQueue.Enqueue (s);
    50134                }
    51135
    52136                public void Close ()
    53137                {
     138                        if (receiveThread != null) {
     139                                receiveThread.Interrupt ();
     140                        }
     141                        if (sendThread != null) {
     142                                sendThread.Interrupt ();
     143                        }
    54144                        if (client != null)
    55145                                client.Close ();
     
    61151                        if (client != null && !client.Connected) {
    62152                                Log.Out ("Telnet connection interrupted: " + endpoint);
     153                                Close ();
    63154                        }
    64155                        return (client == null) || (!client.Connected);
     
    70161                }
    71162
    72                 public void SetAuthenticated ()
    73                 {
    74                         authenticated = true;
    75                 }
    76 
    77                 public bool Read ()
    78                 {
    79                         while (!IsClosed() && stream.CanRead && stream.DataAvailable) {
    80                                 int b = stream.ReadByte ();
    81                                 if (b == '\r' || b == '\n') {
    82                                         if (lineBufferLength > 0) {
    83                                                 return true;
    84                                         }
    85                                 } else if (b >= 0) {
    86                                         lineBuffer [lineBufferLength] = (byte)b;
    87                                         lineBufferLength++;
    88                                 }
    89                         }
    90                         return false;
    91                 }
    92 
    93                 public string GetLine ()
    94                 {
    95                         string res = Encoding.UTF8.GetString (lineBuffer, 0, lineBufferLength);
    96                         lineBufferLength = 0;
    97                         return res;
    98                 }
    99 
    100163        }
    101164}
Note: See TracChangeset for help on using the changeset viewer.