125 lines
3.3 KiB
C#
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));
|
|
}
|
|
}
|
|
}
|