我有一个异步TCP服务器,用于接受客户端上传文件的请求。然而在1-4小时后,该服务器会突然停止接受新的连接请求,这一点让我感到困惑,因为我无法确定地重现这个错误。程序中的其他线程继续正常运行,没有任何异常抛出。你有什么建议吗?
在服务器死亡之前,我只看到它成功完成了挂起的请求,然后就停止了。我猜测服务器经常遇到网络断开连接的情况。如何使这段代码更加容错?我已经在可能失败的两个代码块中添加了try-catch,但我感觉还是漏掉了些什么。
我设置了另一个线程来检查此服务器是否释放了套接字,但似乎即使在停止处理客户端请求后,套接字仍在使用中。我使用
在服务器死亡之前,我只看到它成功完成了挂起的请求,然后就停止了。我猜测服务器经常遇到网络断开连接的情况。如何使这段代码更加容错?我已经在可能失败的两个代码块中添加了try-catch,但我感觉还是漏掉了些什么。
我设置了另一个线程来检查此服务器是否释放了套接字,但似乎即使在停止处理客户端请求后,套接字仍在使用中。我使用
netstat -a
进行了验证。internal class TCPServer
{
private readonly int _listeningPort;
private TcpListener listener;
public TCPServer(int port)
{
_listeningPort = port;
listener = new TcpListener(IPAddress.Any, _listeningPort);
listener.Start(int.MaxValue);
}
public async void Start()
{
while (true)
{
Log.Verbose("Waiting for connections...");
try
{
var tcpClient = await listener.AcceptTcpClientAsync();
Task t = HandleConnectionAsync(tcpClient);
await t;
}
catch (Exception exp)
{
Log.Fatal(exp.ToString());
}
}
}
private async Task HandleConnectionAsync(TcpClient tcpClient)
{
try
{
string outputFile = ""; // get a random string
using (var stream = tcpClient.GetStream())
using (var output = File.Create(outputFile))
{
//...
while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) > 0)
{
// ...
await output.WriteAsync(buffer, 0, bytesRead);
}
}
tcpClient.Close();
}
catch (Exception exp)
{
Log(exp.Message);
}
}