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

时间:2012-04-17 21:57:01

标签: c# properties ip-address

旁注:我真的想不出一个好头衔。

好的,我正在努力更新由不相信代码重用的开发人员整理的程序。因此,我的任务是更新并使其对未来的变化“友好”。

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

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

我决定创建一个接口并在类上实现它。

(我有没有失去你)

该方法实际上只是将主机名(方法参数之一)转换为ipaddress,并生成命令提示符以对其进行ping操作。我还有一个SEPARATE类,它实现了接口并调用了方法,但是实例传递了一个字符串(hostname),它传递了一个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吗?或者只是制作一个新方法并调用它?

很抱歉,我知道它现在不是很优雅,我只是想确保自己处于写作方向,然后才真正深入研究。

感谢大家的帮助。

2 个答案:

答案 0 :(得分:1)

首先,我建议使用System.Net.IPAddress而不是滚动自己。 http://msdn.microsoft.com/en-us/library/system.net.ipaddress.aspx

其次,您可以使用System.Net.NetworkInformation.Ping来执行ICMP-Echo http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx

e.g。

        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);
        }

答案 1 :(得分:0)

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

foreach (IPAddress address in Dns.GetHostAddresses(hostName))
{
   PingReply reply = Ping.Send(address);
   ...
}

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