Um die andere Hälfte Ihrer Frage zu beantworten:
Jede andere Beratung zum Thema Asynchrone TCP Sockets ist willkommen als auch
Einfach gesagt ich dies in der Art und Weise nicht schaffen würde demonstriert von Ihrem ursprünglichen Beitrag. Suchen Sie stattdessen in den Klassen System.Net.Sockets.TcpClient und System.Net.Sockets.TcpListener nach Hilfe. Verwenden Sie asynchrone Aufrufe wie BeginAcceptSocket (...) und BeginRead (...), und ermöglichen Sie dem ThreadPool, seine Aufgabe zu erledigen. Es ist wirklich ziemlich einfach, sich so zusammenzusetzen.
Sie sollten in der Lage sein, alle das Serververhalten ohne immer Sie wünschen zu erreichen Codierung die gefürchteten Worte „New Thread“ :)
Hier ist ein einfaches Beispiel von der Idee, minus der Idee des ordnungsgemäßen Herunterfahrens, Ausnahmebehandlung 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();
}
}
Für ein viel komplizierteres Beispiel dafür, wie dies die SslTunnel Library ich vor einer Weile geschrieben tun sehen.
Du gehst ins Gefängnis, dann wirst du freigelassen. – SwDevMan81