Чтобы ответить на другую половину вашего вопроса:
Любой другой совет по вопросу асинхронных сокетов TCP также приветствуется
Проще говоря, я бы не справился с этим так, как продемонстрировал ваш оригинальный пост. Скорее обратитесь за помощью к классам System.Net.Sockets.TcpClient и System.Net.Sockets.TcpListener. Используйте асинхронные вызовы, такие как BeginAcceptSocket (...) и BeginRead (...), и разрешите ThreadPool выполнять свою работу. Это действительно довольно легко собрать таким образом.
Вы должны быть в состоянии достичь желаемого поведения сервера, даже не кодируя страшные слова «новая тема»:)
Вот базовый пример идеи, за исключением идеи постепенного отключения, обработки исключений и т. Д .:
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();
}
}
Более сложный пример того, как это сделать, см. В библиотеке SslTunnel , которую я написал некоторое время назад.