mirror of
https://github.com/markjprice/cs11dotnet7.git
synced 2025-12-06 05:32:03 +01:00
5.2 KiB
5.2 KiB
Working with network resources
This is an optional bonus section for Chapter 8. It is not required to complete the rest of the book.
Sometimes you will need to work with network resources. The most common types in .NET for working with network resources are shown in the following table:
| Namespace | Example type(s) | Description |
|---|---|---|
System.Net |
Dns, Uri, Cookie, WebClient, IPAddress |
These are for working with DNS servers, URIs, IP addresses, and so on. |
System.Net |
FtpStatusCode, FtpWebRequest, FtpWebResponse |
These are for working with FTP servers. |
System.Net |
HttpStatusCode, HttpWebRequest, HttpWebResponse |
These are for working with HTTP servers; that is, websites and services. Types from System.Net.Http are easier to use. |
System.Net.Http |
HttpClient, HttpMethod, HttpRequestMessage, HttpResponseMessage |
These are for working with HTTP servers; that is, websites and services. You will learn how to use these in Chapter 15, Building and Consuming Web Services. |
System.Net.Mail |
Attachment, MailAddress, MailMessage, SmtpClient |
These are for working with SMTP servers; that is, sending email messages. |
System.Net.NetworkInformation |
IPStatus, NetworkChange, Ping, TcpStatistics |
These are for working with low-level network protocols. |
Working with URIs, DNS, and IP addresses
Let's explore some common types for working with network resources:
-
Use your preferred code editor to add a new Console App /
consoleproject namedWorkingWithNetworkResourcesto theChapter08solution/workspace.- In Visual Studio Code, select
WorkingWithNetworkResourcesas the active OmniSharp project.
- In Visual Studio Code, select
-
In
Program.cs, delete the existing statements and then import the namespace for working with a network, as shown in the following code:
using System.Net; // IPHostEntry, Dns, IPAddress
- In
Program.cs, add statements to prompt the user to enter a website address, and then use theUritype to break it down into its parts, including the scheme (HTTP, FTP, and so on), port number, and host, as shown in the following code:
Write("Enter a valid web address (or press Enter): ");
string? url = ReadLine();
if (string.IsNullOrWhiteSpace(url)) // if they enter nothing...
{
// ... set a default URL
url = "https://stackoverflow.com/search?q=securestring";
}
Uri uri = new(url);
WriteLine($"URL: {url}");
WriteLine($"Scheme: {uri.Scheme}");
WriteLine($"Port: {uri.Port}");
WriteLine($"Host: {uri.Host}");
WriteLine($"Path: {uri.AbsolutePath}");
WriteLine($"Query: {uri.Query}");
- Run the code, enter a valid website address or press Enter, and view the result, as shown in the following output:
Enter a valid web address (or press Enter):
URL: https://stackoverflow.com/search?q=securestring
Scheme: https
Port: 443
Host: stackoverflow.com
Path: /search
Query: ?q=securestring
- In
Program.cs, add statements to get the IP address for the entered website, as shown in the following code:
IPHostEntry entry = Dns.GetHostEntry(uri.Host);
WriteLine($"{entry.HostName} has the following IP addresses:");
foreach (IPAddress address in entry.AddressList)
{
WriteLine($" {address} ({address.AddressFamily})");
}
- Run the code, enter a valid website address or press Enter, and view the result, as shown in the following output:
stackoverflow.com has the following IP addresses:
151.101.1.69 (InterNetwork)
151.101.65.69 (InterNetwork)
151.101.129.69 (InterNetwork)
151.101.193.69 (InterNetwork)
Pinging a server
Now you will add code to ping a web server to check its health:
- In
Program.cs, import the namespace to get more information about networks, as shown in the following code:
using System.Net.NetworkInformation; // Ping, PingReply, IPStatus
- Add statements to ping the entered website, as shown in the following code:
try
{
Ping ping = new();
WriteLine("Pinging server. Please wait...");
PingReply reply = ping.Send(uri.Host);
WriteLine($"{uri.Host} was pinged and replied: {reply.Status}.");
if (reply.Status == IPStatus.Success)
{
WriteLine("Reply from {0} took {1:N0}ms",
arg0: reply.Address,
arg1: reply.RoundtripTime);
}
}
catch (Exception ex)
{
WriteLine($"{ex.GetType().ToString()} says {ex.Message}");
}
- Run the code, press Enter, and view the result, as shown in the following output:
Pinging server. Please wait...
stackoverflow.com was pinged and replied: Success.
Reply from 151.101.193.69 took 9ms
- Run the code again but this time enter
http://google.com, as shown in the following output:
Enter a valid web address (or press Enter): http://google.com
URL: http://google.com
Scheme: http
Port: 80
Host: google.com
Path: /
Query:
google.com has the following IP addresses:
2a00:1450:4009:822::200e (InterNetworkV6)
142.250.180.14 (InterNetwork)
Pinging server. Please wait...
google.com was pinged and replied: Success.
Reply from 2a00:1450:4009:822::200e took 9ms