Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将主机名转换为IP地址,然后ping_C#_Properties_Ip Address - Fatal编程技术网

C# 将主机名转换为IP地址,然后ping

C# 将主机名转换为IP地址,然后ping,c#,properties,ip-address,C#,Properties,Ip Address,旁注:我真的想不出一个好的标题 好的,我正在更新一个由一个不相信代码重用的开发人员编写的程序。因此,我的任务是更新并使其“友好”以适应未来的变化 编辑我应该说:最终用户想要一个命令提示符来查看每个ping。我知道使用内置的ping是一个更好的选择,但这是他们想要的…你们知道这是怎么回事 我正在使用一个类,该类在整个程序中实现了几次。(以前有两个类基本上做相同的事情) 我决定制作一个接口并在类上实现它 (我失去你了吗) 该方法实际上只是将主机名(方法参数之一)转换为ipaddress,并生成命令提

旁注:我真的想不出一个好的标题

好的,我正在更新一个由一个不相信代码重用的开发人员编写的程序。因此,我的任务是更新并使其“友好”以适应未来的变化

编辑我应该说:最终用户想要一个命令提示符来查看每个ping。我知道使用内置的ping是一个更好的选择,但这是他们想要的…你们知道这是怎么回事

我正在使用一个类,该类在整个程序中实现了几次。(以前有两个类基本上做相同的事情)

我决定制作一个接口并在类上实现它

(我失去你了吗)

该方法实际上只是将主机名(方法参数之一)转换为ipaddress,并生成命令提示符对其进行ping。我还有一个单独的类,它实现接口并调用该方法,但不传递字符串(主机名),而是传递ipaddress对象

我的问题在于:在处理可能改变类型的参数时,什么是最佳实践?有人能看看我做了什么吗?这很好,我只是想确定这是最佳实践

// Interface that is implement twice in the program 
interface Icmd_Ping
    {
    void initilize_Proc(object target, string last_Octet);

    }


 class process_spawn : Icmd_Ping
{     
    writeLog_Delegate writeLog = new writeLog_Delegate(error_Log.write_log);

    private string ipaddress;
    public object Ipaddress
        {
        get { return ipaddress; }
        set
            {                
            IPAddress ip = value as IPAddress;
            if (ip != null)
                ipaddress = ip.ToString();
            else
                {

                try
                    {
                    formatIP format = new formatIP();
                    ipaddress = format.convert_Ip(((string)value));
                    }
                catch (Exception ex)
                    {
                    writeLog(ex);
                    }
                }   
            }
        }

    public void initilize_Proc(object target, string last_Octet = null)
        {
        if (target == null)
            throw new ArgumentNullException();

        formatIP format_IP = new formatIP();
        this.Ipaddress = target;

        Process cmd = new Process();
        ProcessStartInfo psi = new ProcessStartInfo {FileName = "cmd", UseShellExecute = false, RedirectStandardOutput = false };
        cmd.StartInfo = psi;

        if (last_Octet != string.Empty)
            psi.Arguments = string.Format("/c ping {0} -t", format_IP.format_Ip(((string)Ipaddress), last_Octet));
        if (last_Octet == string.Empty)
            psi.Arguments = string.Format("/c ping {0} -t", ((string)Ipaddress));


        cmd.Start();
        }



}
我应该转换IPaddress属性中的IPaddress吗?或者只是创建一个新方法并调用它

对不起,我知道这一点不是很优雅,我只是想在我真正深入研究这一点之前确保我在写作方向上


谢谢大家的帮助

首先,我建议使用
System.Net.IPAddress
而不是自己滚动。

其次,您可以使用
System.Net.NetworkInformation.Ping
执行ICMP回显

e、 g

IPAddress ip=IPAddress.Parse(“192.168.0.1”);
Ping Ping=新Ping();
对于(int i=0;i<4;++i)
{
var reply=ping.Send(ip);
WriteLine(“来自{0}的回复状态:{1}时间:{2}ms”,
答复.地址:,
答复.现状,
答复:往返时间);
}

您可以使用.NET函数DNS.GetHostAddresses()将DNS条目解析为单个主机地址(我认为这也是您的要求之一)


然后,将回复格式化为类似于ping工具的格式。对于TTL和字节发送,参数也可以通过.NET中的Ping.Send()API进行控制。

您是否关心
this.Ipaddress=target
以及如何处理不同的类型?你愿意放弃这一切吗?不,最终用户需要一个命令提示符。我试着相信我。。。是的,我关心的是让它对不同的类型安全。
        IPAddress ip = IPAddress.Parse("192.168.0.1");
        Ping ping = new Ping();

        for (int i = 0; i < 4; ++i)
        {
            var reply = ping.Send(ip);
            Console.WriteLine("Reply from {0} Status: {1} time:{2}ms", 
                              reply.Address, 
                              reply.Status, 
                              reply.RoundtripTime);
        }
foreach (IPAddress address in Dns.GetHostAddresses(hostName))
{
   PingReply reply = Ping.Send(address);
   ...
}