dotnet-core_mail-server/MailServer/PortListener.cs

125 lines
3.3 KiB
C#

using MailServer.SMTPServer;
using SMTPServer.Exceptions;
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace SMTPServer
{
public delegate void ConnectedEventHandler(object source, ConnectedEventArgs e);
public class ConnectedEventArgs : EventArgs
{
private Encoding Encoding { get; set; }
private string Others { get; set; }
public TcpClient Client { get; private set; }
private NetworkStream Stream { get; set; }
public ConnectedEventArgs(TcpClient client, Encoding encoding)
{
Client = client;
Encoding = encoding;
Stream = client.GetStream();
}
public void SendResponse(ResponseCodes responseCode) => SendResponse(responseCode, "");
public void SendResponse (ResponseCodes responseCode, string args)
{
var text = ((int)responseCode).ToString();
text += " " + args;
var bytes = Encoding.UTF8.GetBytes(text);
Stream.Write(bytes, 0 , bytes.Length);
}
private void ReadClientInput()
{
while (true)
{
if (Stream.DataAvailable)
{
byte[] buffer = new byte[Client.ReceiveBufferSize];
Stream.Read(buffer, 0, buffer.Length);
var str = Encoding.GetString(buffer);
lock (Others)
{
Others += str;
}
CheckLines();
} else
{
Thread.Sleep(10);
}
}
}
private void CheckLines()
{
lock (Others)
{
var line = "";
foreach (char c in Others)
{
if (c.Equals('\n'))
{
Console.WriteLine(line);
//NewLine(line);
line = "";
}
else line += c;
}
Others = line;
}
}
}
public class PortListener
{
static List<int> _Ports = null;
TcpListener _Listener;
public event ConnectedEventHandler OnConnected;
public PortListener(int port)
{
if(_Ports == null)
{
_Ports = new List<int>();
}
foreach(var i in _Ports)
{
if (i == port)
{
throw new PortUsedException();
}
}
_Ports.Add(port);
StartListening(new TcpListener(IPAddress.Any, port));
}
private void StartListening(TcpListener listener)
{
listener.Start();
_Listener = listener;
Thread thread = new Thread(new ThreadStart(ListenerAsync));
thread.Start();
}
private async void ListenerAsync()
{
var client = await _Listener.AcceptTcpClientAsync();
Console.WriteLine("Connection");
OnConnected(this, new ConnectedEventArgs(client, Encoding.UTF8));
}
}
}