I have created an SslStream Abstract Class for my Client and i want you to review and enhance it for me if needed
SecureStream.cs
using System;
using System.Net;
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
using Program.Connections.Packets;
using Program.Core.Misc;
namespace Program.Connections.Network
{
public abstract class SecureStream
{
private static readonly byte[] Buffer = new byte[0x1f80];
private const string IpAddress = "192.168.1.65";
private readonly int _port;
private readonly Socket _socket;
private SslStream _sslStream;
public abstract void Receive(byte[] buffer);
public abstract void Error(Exception e);
protected SecureStream(int port)
{
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, true);
_port = port;
}
public void Connect()
{
_socket.BeginConnect(new IPEndPoint(IPAddress.Parse(IpAddress), _port), Authenticate, null);
}
private async void Authenticate(IAsyncResult ar)
{
try
{
var onCertificateValidationCallBack =
new RemoteCertificateValidationCallback(
OnCertificateValidation);
_sslStream = new SslStream(new NetworkStream(_socket, true), false, onCertificateValidationCallBack);
await _sslStream.AuthenticateAsClientAsync(IpAddress);
if (!_sslStream.IsAuthenticated) throw new Exception("not^authenticated");
do
{
var size = await _sslStream.ReadAsync(Buffer, 0, Buffer.Length);
if (size == 0) throw new Exception("invalid^size");
var buffer = new byte[size];
Native.MemoryCopy(Buffer, buffer, (uint)buffer.Length);
Receive(buffer);
Array.Clear(Buffer, 0, Buffer.Length);
} while (_sslStream.CanRead);
}
catch (Exception e)
{
Error(e);
}
}
internal async Task Send(PacketWriter writer)
{
var buffer = writer.GetWorkspace();
await _sslStream.WriteAsync(buffer, 0, buffer.Length);
}
private static bool OnCertificateValidation(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslpolicyerrors)
{
return true;
}
}
}
CoreServer.cs
using System;
using System.Windows.Forms;
namespace Program.Connections.Network
{
public sealed class CoreServer : SecureStream
{
public CoreServer(int p) : base(p) { }
public override void Receive(byte[] buffer)
{
//TODO: Handle The Buffer
}
public override void Error(Exception e)
{
//TODO: Add Error Writer.
MessageBox.Show(
string.Format("Disconnected from the server."),
string.Format("Connection Error"), MessageBoxButtons.OK,
MessageBoxIcon.Error);
Environment.Exit(1);
}
}
}
And i Simply Execute it using
var coreServer = new CoreServer(/*port*/);
coreServer.Connect();