У меня есть следующий код:
public abstract class TcpServer
{
int numberOfListeners = 20;
protected TcpListener listener;
public TcpServer(IPEndPoint endPoint)
{
listener = new TcpListener(endPoint);
listener.Start();
//Not sure if this is correct, did it to ensure there are plenty listeners prompt
for (int i = 0; i < numberOfListeners; i++)
{
BeginAcceptTcpClient();
}
}
protected abstract void ListenerCallBack(IAsyncResult ar);
protected void BeginAcceptTcpClient()
{
listener.BeginAcceptTcpClient(ListenerCallBack, null);
}
}
И реализация
public class SimpleWebServer : TcpServer
{
public SimpleWebServer(IPEndPoint endPoint) : base(endPoint)
{
}
protected override void ListenerCallBack(IAsyncResult ar)
{
//Not sure if this is the proper way of handling multiple connections, in my tests it worked like a charm
BeginAcceptTcpClient();
var client = listener.EndAcceptTcpClient(ar);
Stream outputStream = client.GetStream();
StreamReader sr = null;
try
{
sr = new StreamReader(outputStream);
HandleRequest(sr,outputStream);
}
catch
{
//something went wrong
}
sr?.Dispose();
outputStream.Dispose();
client.Dispose();
}
}
Сначала это работает нормально, но в конце концов (точного времени я бы не сказал несколько часов безотказной работы) сервер перестает отвечать (как если бы пул сокетов был исчерпан). И кажется, что потоки обработчика спят (я измерил время запроса / ответа, оно увеличивается, если сервер простаивает).
- Это правильный способ обработки нескольких запросов?
- Есть ли что-то, что я могу сделать, чтобы улучшить "быстроту" сокетов?
- Есть ли у AcceptTcpClient () тайм-аут? (не нашел)
Большое спасибо!