Para responder a la otra mitad de su pregunta:
Cualquier otro tipo de asesoramiento sobre el tema de asincrónicos de sockets TCP es bienvenida, así
En pocas palabras no me gestionar este a la moda demostrado por tu publicación original. Más bien busque ayuda de las clases System.Net.Sockets.TcpClient y System.Net.Sockets.TcpListener. Use las llamadas asincrónicas como BeginAcceptSocket (...) y BeginRead (...) y permita que ThreadPool haga su trabajo. Es realmente fácil de armar de esa manera.
Usted debe ser capaz de lograr todo el comportamiento del servidor que desee sin tener que codificar las temidas palabras "nuevo hilo" :)
Aquí es un ejemplo básico de la idea, menos la idea de apagado correcto, manejo de excepciones ect:
public static void Main()
{
TcpListener listener = new TcpListener(new IPEndPoint(IPAddress.Loopback, 8080));
listener.Start();
listener.BeginAcceptTcpClient(OnConnect, listener);
Console.WriteLine("Press any key to quit...");
Console.ReadKey();
}
static void OnConnect(IAsyncResult ar)
{
TcpListener listener = (TcpListener)ar.AsyncState;
new TcpReader(listener.EndAcceptTcpClient(ar));
listener.BeginAcceptTcpClient(OnConnect, listener);
}
class TcpReader
{
string respose = "HTTP 1.1 200\r\nContent-Length:12\r\n\r\nHello World!";
TcpClient client;
NetworkStream socket;
byte[] buffer;
public TcpReader(TcpClient client)
{
this.client = client;
socket = client.GetStream();
buffer = new byte[1024];
socket.BeginRead(buffer, 0, 1024, OnRead, socket);
}
void OnRead(IAsyncResult ar)
{
int nBytes = socket.EndRead(ar);
if (nBytes > 0)
{
//you have data... do something with it, http example
socket.BeginWrite(
Encoding.ASCII.GetBytes(respose), 0, respose.Length, null, null);
socket.BeginRead(buffer, 0, 1024, OnRead, socket);
}
else
socket.Close();
}
}
para un ejemplo mucho más complicada de cómo hacerlo, vea la SslTunnel Library que escribí hace un tiempo.
Vas a la cárcel, luego serás liberado. – SwDevMan81