我正在构建一个具有非常基本前提的程序。
对于X量的物体 打开Conection 执行操作 关闭连接 打开下一步
这些连接中的每一个都是在socks5代理上进行的,在大约第200个连接之后,我得到“操作有超时”错误。我已经测试了所有代理,它们工作正常,真正奇怪的是如果我关闭程序并重新启动它,问题就会消失。所以我不得不相信,当我关闭我的连接时,它真的没有关闭连接而且计算机正在超载。 cna如何强制关闭与类关联的所有袜子连接?
socket.Shutdown(SocketShutdown.Both);
//socket.Close();
socket.Disconnect(true);
socket = null;
在回复使用netstat的提示时,我检查了一下。我注意到连接在哪里挥之不去但终于会消失。但是,在大约第100次连接之后,问题仍然存在,连接之间的暂停时间为5秒。我收到超时错误。如果我关闭项目并重新启动它们就会消失。所以出于某种原因,我觉得这些联系留下了一些东西。 Netstat剂量显示它。我甚至尝试将客户端的实例添加到列表中,每次完成后将其从列表中删除,然后将其设置为null。有没有办法杀死一个港口?也许这会起作用,如果我杀死连接正在进行的端口?这可能是Windows操作系统问题吗?用来预防病毒的东西?我正在进行大约一分钟的连接并且连接大约1分钟,然后继续使用至少20个concurent,如果没有更多的连接同时。对我来说有意义的是,在我的代码中没有清理任何资源时,对程序进行调整似乎很清楚。我正在使用我在互联网上找到的类,它允许socks5代理与套接字类一起使用。所以我真的很茫然,任何建议或指导都要很好吗?它必须非常漂亮。我很想找到一个文本文件,我在我的连接列表中并关闭程序,然后让anohter程序重新启动它,以便在此时停止它。
答案 0 :(得分:1)
听起来你的联系并没有真正关闭。没有看到代码,很难解决这个问题;你能把它归结为一个循环开闭序列的程序吗?
如果连接没有按预期关闭,您可以看到它与netstat的状态。你有200个已建立的联系,还是处于某种关闭状态?
答案 1 :(得分:0)
套接字实现IDisposable。只调用Dispose或Close将导致套接字以确定的方式放弃非托管资源。这导致您耗尽套接字使用的资源(可能是某种类型的网络句柄),即使您可能没有任何托管对象使用它们。
所以你应该这样做
socket.Shutdown(SocketShutdown.Both);
socket.Close();
要明确将套接字设置为Null不会这样做,因为将套接字设置为null只会将套接字置于可释放队列上,以便在它处理可释放队列时调用其终结器。
您可能需要查看this article,它提供了一个关于如何在.NET中处理非托管资源的良好模型
<强>更新强> 我检查过,套接字确实包含WSASocket的句柄。因此,除非你打电话关闭或处理掉,否则你必须等到终结者运行(或退出应用程序)才能让他们回来。