/Network/HTTP/HTTPServer.cs |
@@ -13,6 +13,9 @@ |
{ |
public abstract class HTTPServer : IDisposable |
{ |
private readonly ManualResetEventSlim listenStop = new ManualResetEventSlim(false); |
|
private readonly ManualResetEventSlim stopListen = new ManualResetEventSlim(false); |
private int activeRequests; |
|
private HttpListener HTTPListener; |
@@ -24,8 +27,10 @@ |
|
public bool IsRunning => HTTPListener != null && HTTPListener.IsListening; |
|
private readonly ManualResetEventSlim stopListen = new ManualResetEventSlim(false); |
private readonly ManualResetEventSlim listenStop = new ManualResetEventSlim(false); |
public void Dispose() |
{ |
stopListen.Set(); |
} |
|
public bool Start(List<string> prefixes) |
{ |
@@ -37,9 +42,7 @@ |
// Add all prefixes. |
HTTPListener.Prefixes.Clear(); |
foreach (var prefix in prefixes) |
{ |
HTTPListener.Prefixes.Add(prefix); |
} |
|
// Do not bomb if the client disconnects. |
HTTPListener.IgnoreWriteExceptions = true; |
@@ -55,13 +58,13 @@ |
|
private void Listen(object state) |
{ |
HTTPServerCallbackState callbackState = (HTTPServerCallbackState)state; |
var callbackState = (HTTPServerCallbackState) state; |
|
while (callbackState.Listener.IsListening) |
{ |
callbackState.Listener?.BeginGetContext(ContextCallback, callbackState); |
|
if (WaitHandle.WaitAny(new[] { callbackState.ContextRetrieved, stopListen.WaitHandle }) != 1) |
if (WaitHandle.WaitAny(new[] {callbackState.ContextRetrieved, stopListen.WaitHandle}) != 1) |
continue; |
|
try |
@@ -81,7 +84,7 @@ |
|
private void ContextCallback(IAsyncResult ar) |
{ |
var callbackState = (HTTPServerCallbackState)ar.AsyncState; |
var callbackState = (HTTPServerCallbackState) ar.AsyncState; |
HttpListenerContext httpContext; |
|
Interlocked.Increment(ref processedRequests); |
@@ -111,11 +114,6 @@ |
} |
} |
|
public void Dispose() |
{ |
stopListen.Set(); |
} |
|
private class HTTPServerCallbackState |
{ |
public HTTPServerCallbackState(HttpListener listener) |
@@ -131,4 +129,4 @@ |
public AutoResetEvent ContextRetrieved { get; } |
} |
} |
} |
} |
/Network/IPAddressExtensions.cs |
@@ -25,9 +25,7 @@ |
|
var broadcastAddress = new byte[ipAdressBytes.Length]; |
for (var i = 0; i < broadcastAddress.Length; i++) |
{ |
broadcastAddress[i] = (byte)(ipAdressBytes[i] | (subnetMaskBytes[i] ^ 255)); |
} |
broadcastAddress[i] = (byte) (ipAdressBytes[i] | (subnetMaskBytes[i] ^ 255)); |
return new IPAddress(broadcastAddress); |
} |
|
@@ -41,9 +39,7 @@ |
|
var broadcastAddress = new byte[ipAdressBytes.Length]; |
for (var i = 0; i < broadcastAddress.Length; i++) |
{ |
broadcastAddress[i] = (byte)(ipAdressBytes[i] & subnetMaskBytes[i]); |
} |
broadcastAddress[i] = (byte) (ipAdressBytes[i] & subnetMaskBytes[i]); |
return new IPAddress(broadcastAddress); |
} |
|
@@ -55,4 +51,4 @@ |
return network1.Equals(network2); |
} |
} |
} |
} |
/Network/SubnetMask.cs |
@@ -30,11 +30,14 @@ |
var binaryMask = new byte[4]; |
|
for (var i = 0; i < 4; i++) |
{ |
if (i * 8 + 8 <= netPartLength) |
{ |
binaryMask[i] = 255; |
} |
else if (i * 8 > netPartLength) |
{ |
binaryMask[i] = 0; |
} |
else |
{ |
var oneLength = netPartLength - i * 8; |
@@ -42,7 +45,6 @@ |
string.Empty.PadLeft(oneLength, '1').PadRight(8, '0'); |
binaryMask[i] = Convert.ToByte(binaryDigit, 2); |
} |
} |
return new IPAddress(binaryMask); |
} |
|
@@ -61,4 +63,4 @@ |
return CreateByHostBitLength(b.Length); |
} |
} |
} |
} |