旁注:我真的想不出一个好头衔。
好的,我正在努力更新由不相信代码重用的开发人员整理的程序。因此,我的任务是更新并使其对未来的变化“友好”。
编辑我应该说:最终用户想要一个命令提示符来查看每个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吗?或者只是制作一个新方法并调用它?
很抱歉,我知道它现在不是很优雅,我只是想确保自己处于写作方向,然后才真正深入研究。
感谢大家的帮助。
答案 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进行控制。