【问题标题】:Handling IP change on server side TCPListener Socket处理服务器端 TCPListener Socket 上的 IP 更改
【发布时间】:2020-08-11 20:52:43
【问题描述】:

我正在使用 TcpListener 类在我的机器上的某个 IP 和端口上创建一个 TCP 套接字。我使用的代码如下:

tcpListener = new TcpListener("192.168.0.110", 8005);
try
{
    tcpListener.Start();
}
catch (Exception e)
{
    Console.WriteLine(e);
    return;
}

这很好用。我想用一个检查线程来检查监听器的状态。

private void CheckConnections()
{
    while (true)
    {
        if (_tcpListener.Server.IsBound)
        {
            Console.WriteLine(_tcpListener.Active);
            Console.WriteLine("IsBound : True");
        }
        else
        {
            Console.WriteLine(_tcpListener.Active);
            Console.WriteLine("IsBound : False");
        }
        Thread.Sleep(2000);
    }
}

当我从适配器设置手动更改我的机器的 IP 时,例如从“192.168.0.110”到“192.168.0.105”,在“netstat -ano”命令中,我仍然看到“192.168.0.110:8005 "处于监听状态。我也找不到从我的代码中订阅此更改的方法。所以我的问题是如何处理服务器端套接字上的 IP 更改?有没有办法从套接字本身获取 IP 更改信息?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    套接字在关闭后会保持一段时间的侦听状态。这是故意的,并且是由于插座的设计方式造成的。这并不意味着您的代码仍在侦听,这意味着 O/S 正在侦听并且它最终会消失。

    至于问题的第二部分,你可以听NotifyAddrChange通知,关闭你的socket,然后在新地址上重新打开。

    这是一篇关于如何做到这一点的文章。 https://www.codeproject.com/Articles/35137/How-to-use-NotifyAddrChange-in-C

    【讨论】:

    • 在此评论的帮助下,我决定订阅 NetworkChange.NetworkAddressChanged 事件并在那里处理 IP 更改。感谢您的帮助!
    【解决方案2】:

    我不确定这是否是您想要的。 尝试使用TcpListener(IPAddress.Any, 8005); 这将接受任何 IPAddress,因此您不必每次都在代码上更改它。 除非您想在程序运行时更改它,否则会稍微复杂一些。您必须关闭套接字并更改 IP。

    【讨论】:

    • 谢谢。我实际上是在尝试“处理”由其他原因而不是我的程序引起的 IP 更改。如果 IP 地址发生变化,我需要注意这一点并通知用户。因为该 TcpListener 的客户端将无法再访问它。
    • 尝试使用这个:stackoverflow.com/questions/6803073/get-local-ip-address 前后,将其存储在变量中。并创建一个 if 运行后台
    猜你喜欢
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 2017-08-09
    • 2016-11-16
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多