Need help with my very first c# application
-
Here is what I have, did I do something wrong because it is still telling me I am outside of the bounds of the array
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(); //string host = "servername"; string host = "servername"; if (args.Length > 0) { host = args\[0\]; } // 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("Reply from {0}", reply.Address.ToString()); Console.WriteLine("Bytes {0}", reply.Buffer.Length); 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.ReadLine(); } } }
}
Yes! You are still using
args[0]
PingReply reply = pingSender.Send(args\[0\], timeout, buffer, options);
Try:
PingReply reply = pingSender.Send(host, timeout, buffer, options);
Also change the comment near the top:
// args\[0\] can be an IPaddress or host name.
It may be accurate, but it isn't very helpfull! How about:
// Command line arguments can be an IPaddress or host name to ping.
That describes better what you are trying to do, rather than how you are achieving them. However, you get a 5 just for putting comments in your first program. :laugh: Not a bad effort - keep it up! Later, you may want to put in a loop, so you can use a number of addresses in the command line. See
foreach
for details.Real men don't use instructions. They are only the manufacturers opinion on how to put the thing together.
-
Yes! You are still using
args[0]
PingReply reply = pingSender.Send(args\[0\], timeout, buffer, options);
Try:
PingReply reply = pingSender.Send(host, timeout, buffer, options);
Also change the comment near the top:
// args\[0\] can be an IPaddress or host name.
It may be accurate, but it isn't very helpfull! How about:
// Command line arguments can be an IPaddress or host name to ping.
That describes better what you are trying to do, rather than how you are achieving them. However, you get a 5 just for putting comments in your first program. :laugh: Not a bad effort - keep it up! Later, you may want to put in a loop, so you can use a number of addresses in the command line. See
foreach
for details.Real men don't use instructions. They are only the manufacturers opinion on how to put the thing together.
Thanks and be proud, I touched it up to this, this morning and it actually works!!! :-D Next on the list is to import a text file through streamreader? or textreader? Hopefully I can find some more code like this basic ping tool on MSDN or something and then I'll be able to import each server with my foreach loop?
using System;
using System.Net;
using System.Net.NetworkInformation;
using System.Text;
using System.IO;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; string\[\] arr = new string\[\] { "server1", "server2", "server3" }; // server names you want to ping foreach (string i in arr) { int pingloop = 0; Console.WriteLine(i); do { PingReply reply = pingSender.Send(i, timeout, buffer, options); if (reply.Status == IPStatus.Success) { Console.WriteLine("Reply from {0}", reply.Address.ToString() + ": bytes=" + reply.Buffer.Length + " time=" + reply.RoundtripTime + "ms" + " TTL=" + reply.Options.Ttl); pingloop = pingloop +1; //Console.WriteLine("Bytes {0}", reply.Buffer.Length); //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); } } while (pingloop < 4); Console.WriteLine(); } Console.ReadLine(); } }
-
Thanks and be proud, I touched it up to this, this morning and it actually works!!! :-D Next on the list is to import a text file through streamreader? or textreader? Hopefully I can find some more code like this basic ping tool on MSDN or something and then I'll be able to import each server with my foreach loop?
using System;
using System.Net;
using System.Net.NetworkInformation;
using System.Text;
using System.IO;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; string\[\] arr = new string\[\] { "server1", "server2", "server3" }; // server names you want to ping foreach (string i in arr) { int pingloop = 0; Console.WriteLine(i); do { PingReply reply = pingSender.Send(i, timeout, buffer, options); if (reply.Status == IPStatus.Success) { Console.WriteLine("Reply from {0}", reply.Address.ToString() + ": bytes=" + reply.Buffer.Length + " time=" + reply.RoundtripTime + "ms" + " TTL=" + reply.Options.Ttl); pingloop = pingloop +1; //Console.WriteLine("Bytes {0}", reply.Buffer.Length); //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); } } while (pingloop < 4); Console.WriteLine(); } Console.ReadLine(); } }
Well done!:thumbsup: I think you are getting there. A couple of style things, that make it easier to read when you go back to it:
string\[\] arr = new string\[\] { "server1", "server2", "server3" }; // server names you want to ping foreach (string i in arr)
Don't call it "i" - there are a couple of reasons (one of which is that old programmers assume "i" is always an int). Always use descriptive names for variables, it makes it a lot easier to work out what you are trying to do. Since Visual Studio list possible names for you, it isn't a lot of extra typing, and it does make it more readable. Try using "server" instead:
string\[\] servers = new string\[\] { "server1", "server2", "server3" }; // server names you want to ping foreach (string server in servers) { ... }
And try using a
for
loop instead of ado...while
- it makes it more obvious by keeping the whole thing together:int pingloop = 0; do { PingReply reply = pingSender.Send(i, timeout, buffer, options); if (reply.Status == IPStatus.Success) { Console.WriteLine("Reply from {0}", reply.Address.ToString() + ": bytes=" + reply.Buffer.Length + " time=" + reply.RoundtripTime + "ms" + " TTL=" + reply.Options.Ttl); pingloop = pingloop +1; } } while (pingloop < 4);
becomes
for (int retries = 0; retries < 4; retries++) { PingReply reply = pingSender.Send(i, timeout, buffer, options); if (reply.Status == IPStatus.Success) { Console.WriteLine("Reply from {0}", reply.Address.ToString() + ": bytes=" + reply.Buffer.Length + " time=" + reply.RoundtripTime + "ms" + " TTL=" + reply.Options.Ttl); break; } }
It's all about keeping thing together, and making it obvious what is going on. Doing it your way means that "pingloop" is available after the loop, implying that it will be relevant and probably used after the loop. With the for loop, "retries" is not available outside the loop at all. I also added the "break" to prevent repeated pinging once it has succeeded. Good effort though, well done!:cool:
Real men d
-
Well done!:thumbsup: I think you are getting there. A couple of style things, that make it easier to read when you go back to it:
string\[\] arr = new string\[\] { "server1", "server2", "server3" }; // server names you want to ping foreach (string i in arr)
Don't call it "i" - there are a couple of reasons (one of which is that old programmers assume "i" is always an int). Always use descriptive names for variables, it makes it a lot easier to work out what you are trying to do. Since Visual Studio list possible names for you, it isn't a lot of extra typing, and it does make it more readable. Try using "server" instead:
string\[\] servers = new string\[\] { "server1", "server2", "server3" }; // server names you want to ping foreach (string server in servers) { ... }
And try using a
for
loop instead of ado...while
- it makes it more obvious by keeping the whole thing together:int pingloop = 0; do { PingReply reply = pingSender.Send(i, timeout, buffer, options); if (reply.Status == IPStatus.Success) { Console.WriteLine("Reply from {0}", reply.Address.ToString() + ": bytes=" + reply.Buffer.Length + " time=" + reply.RoundtripTime + "ms" + " TTL=" + reply.Options.Ttl); pingloop = pingloop +1; } } while (pingloop < 4);
becomes
for (int retries = 0; retries < 4; retries++) { PingReply reply = pingSender.Send(i, timeout, buffer, options); if (reply.Status == IPStatus.Success) { Console.WriteLine("Reply from {0}", reply.Address.ToString() + ": bytes=" + reply.Buffer.Length + " time=" + reply.RoundtripTime + "ms" + " TTL=" + reply.Options.Ttl); break; } }
It's all about keeping thing together, and making it obvious what is going on. Doing it your way means that "pingloop" is available after the loop, implying that it will be relevant and probably used after the loop. With the for loop, "retries" is not available outside the loop at all. I also added the "break" to prevent repeated pinging once it has succeeded. Good effort though, well done!:cool:
Real men d
Here is my latest code, thanks to all that helped
using System;
using System.Net;
using System.Net.NetworkInformation;
using System.Text;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Threading;namespace Examples.System.Net.NetworkInformation.PingTest
{
public class PingExample
{
public static void Main(string[] args)
{
const string f = @"c:\temp\servernames.txt";
List<string> servers = new List<string>();Ping pingSender = new Ping(); PingOptions options = new PingOptions(); //PingCompletedEventArgs e = new PingCompletedEventArgs(); string line = null; //line in a file PingReply reply = null; // variable reply is set to null and referenced to the object type PingReply //string lineerror = null; // 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 = 250; using (StreamReader r = new StreamReader(f)) { // 3 // Use while != null pattern for loop while ((line = r.ReadLine()) != null) { // 4 // Insert logic here. // ... // "line" is a line in the file. Add it to our List. if (string.IsNullOrEmpty(line)) { // 3 // Test with IsNullOrEmpty //lineerror = "Line appears to be empty"; } else { servers.Add(line); } }//end of while }//end fo using //string\[\] arr = new string\[\] { "server1", "server2", "server3" }; // server names you want to ping foreach (string i in servers) { Console.WriteLine(i); for (int retries = 0; retries < 4; retries++) { try { reply = pingSender.Send(i, timeout, buffer, options);
-
I would like to build a basic ping application. I've seen a few ping applications here that are well developed and a little complicated for me to dissect and figure out how they work at this point in my learning. Does anyone have a console ping application that is bare bones, that I can build off of while I learn? Something that I can launch and hard code variables into, and break and the put back and see how it functions? Thank you!
Hope this example can help you: Process p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = true; if (p.Start()) { p.StandardInput.WriteLine("net use " + strFileName + " " + strPwd + " /user:" + strDomain + "\\" + strId); p.StandardInput.WriteLine("exit"); p.WaitForExit(); string ReturnText = p.StandardOutput.ReadToEnd(); if (ReturnText.IndexOf("成功") >= 0) Dts.TaskResult = (int)ScriptResults.Success; else throw new Exception("fail"); } else throw new Exception("fail"); Reference: http://www.programlive.tk