public void Start()
{
_IsShutdownInProgress = false;
try
{
_Socket = CreateSocketBindAndListen(AddressFamily.InterNetwork, IPAddress.Loopback, Website.Port);
}
catch (Exception e)
{
_Socket = CreateSocketBindAndListen(AddressFamily.InterNetworkV6, IPAddress.IPv6Loopback, Website.Port);
}
Task.Factory.StartNew(() =>
{
while (!_IsShutdownInProgress)
{
try
{
var acceptedSocket = _Socket.Accept();
Task.Factory.StartNew(() =>
{
if (!_IsShutdownInProgress)
{
var conn = new Connection(this, acceptedSocket);
// wait for at least some input
if (conn.WaitForRequestBytes() == 0)
{
conn.WriteErrorAndClose(400);
return;
}
// find or create host
var host = GetHost();
if (host == null)
{
conn.WriteErrorAndClose(500);
return;
}
// process request in worker app domain
host.ProcessRequest(conn);
}
});
}
catch
{
Thread.Sleep(100);
}
}
});
}