当前位置: 首页 > 知识库问答 >
问题:

如何使用 UDP 对远程服务器进行 ping 操作

钱浩荡
2023-03-14

因此,我正在尝试让框架设置来制作一个discord bot,它将检查用户专用服务器是否打开并相应地更新消息。我目前在本地网络中的一台独立计算机上运行Minecraft和Valheim服务器。

我试图使用微软的Ping类,但它不能Ping Valheim服务器。似乎Valheim正在使用UDP协议,所以我尝试使用UdpClient类来发送消息,但是它仍然处于“WaitingForActivation”状态,我不知道发送什么来获得响应。

是否有服务器识别为ping的标准消息?我已经能够对具有UDP模式的站点的端口进行ping,所以我确信它是打开的并且能够被ping。

这是我用来尝试ping的代码

UdpClient udpPing = new UdpClient();
Byte[] sentBytes = Encoding.ASCII.GetBytes("Ping");

udpPing.Connect(servers[i].ip, servers[i].port);
udpPing.Send(sentBytes,sentBytes.Length);

IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, servers[i].port);
Task<UdpReceiveResult> result = udpPing.ReceiveAsync();

bool error = false;
for (int y = 0; result.Status == TaskStatus.WaitingForActivation && !error; y++)
{
    if(y == tryLimit)
    {
        error = true;
    }
}
udpPing.Close();```

共有1个答案

汪弘光
2023-03-14

为什么不使用Ping类?从该页面:

using System;
using System.Net;
using System.Net.NetworkInformation;
using System.Text;

namespace Examples.System.Net.NetworkInformation.PingTest
{
    public class PingExample
    {
        // args[0] can be an IPaddress or host name.
        public static void Main (string[] args)
        {
            Ping pingSender = new Ping ();
            PingOptions options = new PingOptions ();

            // Use the default Ttl value which is 128,
            // but change the fragmentation behavior.
            options.DontFragment = true;

            // Create a buffer of 32 bytes of data to be transmitted.
            string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
            byte[] buffer = Encoding.ASCII.GetBytes (data);
            int timeout = 120;
            PingReply reply = pingSender.Send (args[0], timeout, buffer, options);
            if (reply.Status == IPStatus.Success)
            {
                Console.WriteLine ("Address: {0}", reply.Address.ToString ());
                Console.WriteLine ("RoundTrip time: {0}", reply.RoundtripTime);
                Console.WriteLine ("Time to live: {0}", reply.Options.Ttl);
                Console.WriteLine ("Don't fragment: {0}", reply.Options.DontFragment);
                Console.WriteLine ("Buffer size: {0}", reply.Buffer.Length);
            }
        }
    }
}
 类似资料:
  • 问题内容: 我想要一个PHP脚本,它允许您ping IP地址和端口号()。我找到了类似的脚本,但是它仅适用于网站,而不适用于。 我想要一个游戏服务器。 这个想法是我可以输入IP地址和端口号,然后得到ping响应。 问题答案: 我认为这个问题的答案几乎可以概括您的问题。 如果您要查找给定主机是否将在端口80上接受TCP连接,则可以执行以下操作: 对于TCP以外的任何其他东西,都会更加困难(尽管由于您

  • 问题内容: 我读了一些不错的文章,介绍如何通过Android连接到远程MySQL数据库。在这里和这里 找到了一些非常有趣的链接。 因此,获取数据的常用方法似乎是使用某种Web服务(接口,在本例中为php脚本),该服务将查询数据库并以JSON(或XML)格式呈现结果。然后可以使用android JSON_Object实现解析此输出。到目前为止,一切都很好。 从数据库接收数据并将其显示在android

  • 我目前正在做一个项目,需要一个UDP通信之间的服务器亚马逊法兰克福)和几个主机(Arduino)。我需要能够发送JSON数据从服务器到主机通过UDP,它需要实时工作(时间是一个真正的限制在这里)。此外,主机将定期与服务器通话,通知服务器其状态。 我面临的问题是,虽然我可以ping服务器,但当我创建带有端口的UDP套接字时,我会得到这个错误(对于任何端口): errno99:无法分配请求的地址 我也

  • 问题内容: 在Python中,是否可以通过ICMP对服务器进行ping操作,如果服务器响应则返回TRUE,如果没有响应则返回FALSE? 问题答案: 此功能可在任何操作系统(Unix,Linux,macOS和Windows) Python 2和Python 3中使用 编辑: 被@radato 替换为。这样可以避免在主机名字符串可能未经验证的情况下出现外壳注入漏洞。 请注意,根据Windows上的@

  • 我正在尝试使用类的实例向远程服务器发送HTTP POST请求。尽管我能够得到响应代码和响应消息,但当我尝试将输入流写入时,我实际上无法读取任何行。 当我分析从WireShark发送的数据包时,我注意到远程服务器正在发送一个完整的响应。我唯一的猜测是,为什么我在Java程序中看不到它,是因为我试图从InputStream中读取的时间太晚了。 那么,如何使用我的对象从远程服务器读取即时、完整的响应?以