あなたの質問の残りの半分に答えるには:
非同期 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 ライブラリを参照してください。