【问题标题】:Checking whether the server is on/off检查服务器是否开启/关闭
【发布时间】:2012-03-07 12:01:12
【问题描述】:

我正在尝试构建一些程序来检测某个游戏的服务器是打开还是关闭,我有服务器的 IP 和端口。

如何检测服务器是打开还是关闭?插座?平课?

如果你们能给我一个代码示例之类的,那就太好了。

非常感谢!

【问题讨论】:

  • 你应该只ping服务器。但是你必须意识到你不能说服务器是打开或关闭的。假设您 ping 服务器,您的数据包可能永远不会到达服务器,因此即使服务器在线,它也不会收到请求,因此不会响应,因此您认为它处于离线状态。当您收到响应时也是如此,服务器可能在发送响应后立即崩溃,因此当您认为它在线时,它可能已离线。但在您的情况下,这些不确定性可能可以忽略不计。
  • @SimonBangTerkildsen 我不太了解网络,为什么该数据包不会到达服务器?我的程序应该一直 ping 服务器,直到它联机。应该有问题吧?
  • @idish:数据包可能无法到达服务器,因为服务器前面的防火墙可能会阻止 ping。更好的策略是尝试连接到实际服务。 (或者,如果你有一个像“nmap”这样的程序,你可以做一个 SYN-only 探测。)
  • @DavidSchwartz 我明白了,那么这意味着我所有的 ping 都不会到达服务器,对吧?另外,我如何连接到实际的服务,需要多长时间?谢谢。

标签: c# sockets networking network-programming


【解决方案1】:

见Socket.Connect

public static void Connect1(string host, int port)
{
    IPAddress[] IPs = Dns.GetHostAddresses(host);

    Socket s = new Socket(AddressFamily.InterNetwork,
        SocketType.Stream,
        ProtocolType.Tcp);

    Console.WriteLine("Establishing Connection to {0}", 
        host);
    s.Connect(IPs[0], port); // Catch any exceptions here.
    Console.WriteLine("Connection established");
}   

通过 ping 服务器,您可以获得服务器是“开启”还是“关闭”的指示;它不会指示您尝试连接的服务是否正在运行。

如果您正在寻找第一个选项(大致了解服务器是否已打开并连接到互联网),则 ping 就足以完成此任务。

根据效率 - ping 更有效(嗯,在大规模方面),因为服务器和客户端之间仅交换 2 个数据包,而不是大约 3 个数据包的完整连接建立 - See TCP 3-Way handshake

【讨论】:

  • 非常感谢您的回答,虽然我只需要检查服务器是否打开或关闭,我真的不必连接到它,所以我的问题是:做什么更有效,您的回答或 JP Hellemons 的回答(见评论)再次感谢您!
  • 非常感谢您的回答,我现在真的得走了,等我回来我会试试的,谢谢!
【解决方案2】:

您可以通过尝试连接来检查服务器计算机是否已打开,但服务器程序未运行。如果服务器程序正在运行,您将被连接,但如果它没有运行,您将收到“连接被拒绝”错误。

但是,在大多数情况下,服务器机器宕机和您与服务器之间的网络宕机之间不可能有区别,因为这两种情况很可能只会导致超时。

【讨论】:

    【解决方案3】:

    也许最好将所有连接逻辑集中到一个管理器中,如果连接中断,只需通知客户端服务器已关闭。一直ping服务器是错误的行为。

    【讨论】:

      猜你喜欢
      • 2015-04-07
      • 2011-10-10
      • 1970-01-01
      • 2011-06-22
      • 2019-08-16
      • 1970-01-01
      • 2013-05-03
      • 2019-11-12
      • 2012-02-17
      相关资源
      最近更新 更多