public async Task HandleClient(TcpClient client, AccessControlInfo acinfo)
{
logger.Debug("Output thread started");
client.ReceiveBufferSize = 16*1024;
client.SendBufferSize = 16*1024;
client.NoDelay = true;
var stream = client.GetStream();
int trying = 0;
try {
retry:
stream.WriteTimeout = 3000;
stream.ReadTimeout = 3000;
var remote_endpoint = (IPEndPoint)client.Client.RemoteEndPoint;
var handler = await CreateMatchedHandler(remote_endpoint, stream, acinfo);
if (handler!=null) {
logger.Debug("Output stream started {0}", trying);
var result = await handler.Start();
switch (result) {
case HandlerResult.Continue:
trying++;
goto retry;
case HandlerResult.Close:
case HandlerResult.Error:
default:
break;
}
}
else {
logger.Debug("No protocol handler matched");
}
}
finally {
logger.Debug("Closing client connection");
stream.Close();
client.Close();
}
}