gpt4 book ai didi

c# - 为什么 TcpListener 会泄漏 ESTABLISHED 连接?

转载 作者:可可西里 更新时间:2023-11-01 02:43:03 26 4
gpt4 key购买 nike

我有一个应用程序可以从大约 30 辆汽车的调制解调器中监听消息。我已经使用 TcpListener 来实现如下所示的服务器代码(省略了错误处理):

...
listener.Start()
...
void
BeginAcceptTcpClient()
{
if(listener.Server.IsBound) {
listener.BeginAcceptTcpClient(TcpClientAccepted, null);
}
}

void
TcpClientAccepted(IAsyncResult ar)
{
var buffer = new byte[bufferSize];

BeginAcceptTcpClient();
using(var client = EndAcceptTcpClient(ar)) {
using(var stream = client.GetStream()) {
var count = 0;
while((count = stream.Read(buffer, total, bufferSize - total)) > 0) {
total += count;
}
}
DoSomething(buffer)
}

我正确地收到消息,我的问题在于断开连接。调制解调器每 12 小时重置一次并获得一个新的 IP 地址,但服务器继续保持旧连接处于事件状态(它们在 tcpview 中标记为 ESTABLISHED)。有没有办法为旧连接设置超时?我认为通过关闭 TcpClient TCP 连接已关闭(这就是我本地测试中发生的情况),我做错了什么?

最佳答案

我实际上对代码示例有点困惑 - 问题建议这些问题打开了相当长的时间,但代码更典型的是非常短的突发;对于长时间运行的连接,我希望在这里看到一个异步 API,而不是同步 API。

sockets 不留痕迹地死掉是很常见的,尤其是当分布着许多都需要发现关闭的中间设备时。特别是无线网络,有时会尝试人为地保持套接字处于事件状态,因为短暂地失去无线连接是很常见的,因为设备不希望每次都终止所有连接。

因此,在连接上实现某种心跳是很常见的,这样您就可以跟踪谁还真正活着。

举个例子——我这里有一个 websocket 服务器,理论上处理正常关闭(通过指示关闭的特定序列)和不正常的套接字关闭(意外终止连接)——但是在过去一个小时左右我看到的 19k 连接中,有 70 个在没有击中其中任何一个的情况下死亡。因此,我会根据(缓慢的)心跳跟踪事件,如果他们在太长时间后仍未响应,则将其杀死。

重新超时;你可以试试 ReceiveTimeout ,但这只会在您通常不希望流量出现较大差距时对您有所帮助。

关于c# - 为什么 TcpListener 会泄漏 ESTABLISHED 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9515778/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com