【问题标题】:Sockets and Timeout Errors套接字和超时错误
【发布时间】:2011-01-03 00:23:43
【问题描述】:

我正在构建一个具有非常基本前提的程序。

对于 X 数量的对象 打开连接 执行操作 关闭连接 打开下一步

这些连接中的每一个都是在 socks5 代理上建立的,大约在第 200 个连接后,我收到“操作超时”错误。我已经测试了所有代理,它们工作得很好,真正奇怪的是,如果我关闭程序并重新启动它,问题就会消失。因此,我只能相信,当我关闭连接时,它实际上并没有关闭连接,并且计算机正在过载。我如何强制关闭与某个类关联的所有 socks 连接?

            socket.Shutdown(SocketShutdown.Both);
            //socket.Close();

            socket.Disconnect(true);
            socket = null;

针对使用 netstat 的提示,我检查了它。我注意到那些挥之不去但最终会消失的联系。但是,问题仍然存在,大约第 100 次连接后,连接之间有 5 秒的暂停。我收到超时错误。如果我关闭程序并重新启动它,它们就会消失。所以出于某种原因,我觉得这些联系正在留下一些东西。 Netstat dosent 显示它。我什至尝试将客户端的实例添加到列表中,每次完成时将其从列表中删除,然后将其设置为 null。有没有办法杀死一个端口?如果我杀死了正在建立连接的端口,也许这会起作用?这可能是 Windows 操作系统的问题吗?用来防病毒的东西?我大约每分钟建立一个连接,并维护该连接大约 1 分钟,然后继续进行下一个连接,如果不是同时连接的话,至少有 20 个并发连接。对我来说有意义的是,关闭程序似乎是为了清理我在代码中没有清理的任何资源。我正在使用我在互联网上找到的一个类,它允许将 socks5 代理与套接字类一起使用。所以我真的很茫然,有什么建议或方向会很棒吗?它必须很漂亮。我很想写一个我在连接列表中的文本文件并关闭程序,然后让另一个程序重新启动它以从此时停止的地方继续。

【问题讨论】:

    标签: vb.net sockets


    【解决方案1】:

    听起来您的连接并没有真正关闭。没有看到代码,很难解决这个问题;你能把它归结为一个循环开闭序列的程序吗?

    如果连接没有按预期关闭,您可能可以使用 netstat 查看它处于什么状态。您是否有 200 个已建立的连接,或者它们是否处于某种关闭状态?

    【讨论】:

    • 我检查了 netstat 并显示 Time_Wait 连接我关闭
    【解决方案2】:

    套接字实现 IDisposable。只有调用 Dispose 或 Close 才会导致套接字以确定性的方式放弃非托管资源。这会导致您耗尽套接字使用的资源(可能是某种网络句柄),即使您可能没有任何托管对象使用它们。

    所以你可能应该这样做

     socket.Shutdown(SocketShutdown.Both);
     socket.Close();
    

    需要明确的是,将套接字设置为 Null 并不会这样做,因为将套接字设置为 null 只会导致套接字被放置在 freachable 队列中,并在处理 freachable 队列时调用其终结器。

    您可能需要查看this article,它提供了一个很好的模型来说明如何在 .NET 中处理非托管资源

    更新 我检查了一下,Sockets 确实包含一个WSASocket 的句柄。因此,除非您调用 close 或 dispose,否则您必须等到终结器运行(或退出应用程序)才能让它们恢复。

    【讨论】:

    • 那么您将如何关闭或处理套接字以确保我可以将它们全部取回?
    • socket.Close();socket.Dispose();。注意:如果您决定保留socket.Disconnect(true);,请确保在关闭或处置之前执行此操作,因为如果您在此之后执行此操作,它会抛出ObjectDisposedException。另外我之前没有提到,但你也可以使用using关键字
    猜你喜欢
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 2021-03-27
    • 2013-05-23
    • 2016-06-14
    相关资源
    最近更新 更多