sockscape/server/Kneesocks/Connection.cs

75 lines
2.4 KiB
C#
Raw Normal View History

2017-04-21 21:04:03 +00:00
using System;
using System.Collections.Generic;
using System.Linq;
2017-04-23 04:55:29 +00:00
using System.Net.Sockets;
2017-04-21 21:04:03 +00:00
using System.Text;
using System.Threading.Tasks;
namespace Kneesocks {
public abstract class Connection {
2017-05-03 21:10:50 +00:00
public UInt64 Id { get; private set; }
2017-04-23 04:55:29 +00:00
private TcpClient Socket;
private NetworkStream Stream;
public bool Disconnected { get; private set; } = false;
public string DisconnectReason { get; private set; } = null;
public bool Handshaked { get; private set; } = false;
private string RawClientHandshake = "";
private Dictionary<string, string> Headers =
new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
2017-04-23 04:55:29 +00:00
2017-05-03 21:10:50 +00:00
protected Connection(UInt64 id, TcpClient sock) {
Id = id;
2017-04-23 04:55:29 +00:00
Socket = sock;
Socket.ReceiveTimeout = 1;
Stream = sock.GetStream();
2017-04-23 04:55:29 +00:00
}
2017-05-03 21:10:50 +00:00
protected Connection(Connection conn) {
Id = conn.Id;
Socket = conn.Socket;
Stream = Socket.GetStream();
Disconnected = conn.Disconnected;
DisconnectReason = conn.DisconnectReason;
Handshaked = conn.Handshaked;
RawClientHandshake = conn.RawClientHandshake;
Headers = conn.Headers;
}
public void Disconnect(string reason = null) {
Disconnect(Frame.kClosingReason.Normal, reason);
}
public void Disconnect(Frame.kClosingReason status, string reason = null) {
Disconnected = true;
DisconnectReason = reason;
if(Socket.Connected) {
Socket.SendTimeout = 1000;
var raw = Handshaked ? Frame.Closing(status, reason).GetBytes()
: Handshake.DenyRequest().ToString().GetBytes();
Stream.Write(raw, 0, raw.Length);
Socket.Close();
}
OnClose();
}
// called after the client successfully handshakes
public virtual void OnOpen() { }
// called when the thread manager iterates through
// the thread list and stops on this thread
public virtual void OnParse() { }
// called when data has been received
public virtual void OnReceive(byte[] data) { }
2017-04-23 04:55:29 +00:00
// called when the connection is disconnected
public virtual void OnClose() { }
2017-04-21 21:04:03 +00:00
}
}