From 55ed7c71c3c96ef1685060203babf37b58f6bcdd Mon Sep 17 00:00:00 2001 From: Mark J Price Date: Wed, 19 Oct 2022 10:55:23 +0100 Subject: [PATCH] Update network-resources.md --- docs/bonus/network-resources.md | 129 +++++++++++++++++++++++++++++++- 1 file changed, 128 insertions(+), 1 deletion(-) diff --git a/docs/bonus/network-resources.md b/docs/bonus/network-resources.md index a36d562..00734e5 100644 --- a/docs/bonus/network-resources.md +++ b/docs/bonus/network-resources.md @@ -1,3 +1,130 @@ # Working with network resources -> This is an optional bonus section for Chapter 8. It is not required to complete the rest of the book. \ No newline at end of file +> This is an optional bonus section for Chapter 8. It is not required to complete the rest of the book. + +- [Working with network resources](#working-with-network-resources) + - [Working with URIs, DNS, and IP addresses](#working-with-uris-dns-and-ip-addresses) + - [Pinging a server](#pinging-a-server) + +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: + +1. Use your preferred code editor to add a new **Console App** / `console` project named `WorkingWithNetworkResources` to the `Chapter08` solution/workspace. + + - In Visual Studio Code, select `WorkingWithNetworkResources` as the active OmniSharp project. + +2. In `Program.cs`, delete the existing statements and then import the namespace for working with a network, as shown in the following code: +```cs +using System.Net; // IPHostEntry, Dns, IPAddress +``` +3. In `Program.cs`, add statements to prompt the user to enter a website address, and then use the `Uri` type 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: +```cs +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}"); +``` +4. 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 +``` +5. In `Program.cs`, add statements to get the IP address for the entered website, as shown in the following code: +```cs +IPHostEntry entry = Dns.GetHostEntry(uri.Host); +WriteLine($"{entry.HostName} has the following IP addresses:"); +foreach (IPAddress address in entry.AddressList) +{ + WriteLine($" {address} ({address.AddressFamily})"); +} +``` +6. 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: + +1. In `Program.cs`, import the namespace to get more information about networks, as shown in the following code: +```cs +using System.Net.NetworkInformation; // Ping, PingReply, IPStatus +``` +2. Add statements to ping the entered website, as shown in the following code: +```cs +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}"); +} +``` +3. 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 +``` +4. 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 +``` \ No newline at end of file