Leg*_*end 4 .net c# asynchronous tcp async-await
我有以下异步TCP服务器,我用它来接受来自想要上传文件的客户端的传入请求.大约1-4小时后,服务器只是停止接受任何新连接.这让我感到困惑,因为我无法确定性地重现错误.程序中的其余线程继续正常运行.没有任何例外.关于可能发生什么的任何建议?
在服务器崩溃之前,我所看到的是它设法完成待处理的请求然后停止.我怀疑服务器是否经常出现网络断开连接.如何使这段代码对故障更加健壮?我已经将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);
}
}
Run Code Online (Sandbox Code Playgroud)
有三个问题:
await t;
.您已经记录了worker函数中的所有错误.Task.Run(() => HandleConnectionAsync(tcpClient))
要确保处理可以立即继续.现在所有文件打开的东西都是同步的并且阻止了接受工作流程.tcpClient
通过包装确定性地接近:using (tcpClient) ...
.这可以防止僵尸客户端在出现错误时闲逛. 归档时间: |
|
查看次数: |
1211 次 |
最近记录: |