From 52bc3ca1b449f6538ad1195de063149cca04197c Mon Sep 17 00:00:00 2001 From: Genevieve Warren <24882762+gewarren@users.noreply.github.com> Date: Thu, 13 Oct 2022 12:38:06 -0700 Subject: [PATCH 1/2] restore shared project --- .../snippets/shared/GlobalUsings.cs | 3 ++ .../snippets/shared/NetworkDiscovery.cs | 36 +++++++++++++++++++ .../networking/snippets/shared/shared.csproj | 9 +++++ 3 files changed, 48 insertions(+) create mode 100644 docs/fundamentals/networking/snippets/shared/GlobalUsings.cs create mode 100644 docs/fundamentals/networking/snippets/shared/NetworkDiscovery.cs create mode 100644 docs/fundamentals/networking/snippets/shared/shared.csproj diff --git a/docs/fundamentals/networking/snippets/shared/GlobalUsings.cs b/docs/fundamentals/networking/snippets/shared/GlobalUsings.cs new file mode 100644 index 0000000000000..4015a9c10c0b0 --- /dev/null +++ b/docs/fundamentals/networking/snippets/shared/GlobalUsings.cs @@ -0,0 +1,3 @@ +global using System.Net; +global using System.Net.Sockets; +global using System.Net.NetworkInformation; diff --git a/docs/fundamentals/networking/snippets/shared/NetworkDiscovery.cs b/docs/fundamentals/networking/snippets/shared/NetworkDiscovery.cs new file mode 100644 index 0000000000000..556da991ebff7 --- /dev/null +++ b/docs/fundamentals/networking/snippets/shared/NetworkDiscovery.cs @@ -0,0 +1,36 @@ +public static class NetworkDiscovery +{ + public static ValueTask GetTcpEndPointAsync(int port = 13) => + GetLocalEndPointAsync(port); + + public static ValueTask GetSocketEndPointAsync(int port = 9_000) => + GetLocalEndPointAsync(port); + + static async ValueTask GetLocalEndPointAsync(int startingPort) + { + var port = startingPort; + while (IsActivelyBeingUsed(port) && port > IPEndPoint.MaxPort) ++ port; + + var localIP = await GetLocalhostIPAddressAsync(); + + Console.WriteLine($"Found: {localIP} available on port {port}."); + + return new IPEndPoint(localIP, port); + } + + public static async ValueTask GetLocalhostIPAddressAsync() + { + var localhost = await Dns.GetHostEntryAsync(Dns.GetHostName()); + var isInterNetwork = static (IPAddress ip) => + ip.AddressFamily is AddressFamily.InterNetwork; + var localIP = localhost.AddressList.FirstOrDefault(isInterNetwork) + ?? throw new Exception("Unable to get a local inter network IP."); + + return localIP; + } + + static bool IsActivelyBeingUsed(int port) => + IPGlobalProperties.GetIPGlobalProperties() + .GetActiveTcpListeners() + .Any(ip => ip.Port == port); +} diff --git a/docs/fundamentals/networking/snippets/shared/shared.csproj b/docs/fundamentals/networking/snippets/shared/shared.csproj new file mode 100644 index 0000000000000..27ac3865b58fe --- /dev/null +++ b/docs/fundamentals/networking/snippets/shared/shared.csproj @@ -0,0 +1,9 @@ + + + + net6.0 + enable + enable + + + From b41fecbd6c14309eac562e1d52c907bc942d7298 Mon Sep 17 00:00:00 2001 From: Genevieve Warren <24882762+gewarren@users.noreply.github.com> Date: Thu, 13 Oct 2022 13:42:12 -0700 Subject: [PATCH 2/2] add solution file --- .../networking/snippets/networking.sln | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 docs/fundamentals/networking/snippets/networking.sln diff --git a/docs/fundamentals/networking/snippets/networking.sln b/docs/fundamentals/networking/snippets/networking.sln new file mode 100644 index 0000000000000..fe5ad1629b4ba --- /dev/null +++ b/docs/fundamentals/networking/snippets/networking.sln @@ -0,0 +1,61 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32630.192 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "httpclient", "httpclient\httpclient.csproj", "{48DBB7AA-D843-4F90-A253-5AE6E63A367D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "misc", "misc\misc.csproj", "{33537DD8-9C65-4CA0-907B-4FD4D96895C1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "tcp-client", "tcp\tcp-client\tcp-client.csproj", "{F89CB77D-CE41-49A2-8648-2A0BE94EB010}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "socket-client", "socket\socket-client\socket-client.csproj", "{0C5A3DD1-CDF1-4928-BF4A-092B25AD9361}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "shared", "shared\shared.csproj", "{B87E06A8-48DB-40C0-A491-754C4180C088}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "socket-server", "socket\socket-server\socket-server.csproj", "{56136062-1D11-4CCF-9168-F356AFF568C7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "tcp-listener", "tcp\tcp-listener\tcp-listener.csproj", "{1CDC97AA-F24E-40CF-8816-056DB5AC3AB9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {48DBB7AA-D843-4F90-A253-5AE6E63A367D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {48DBB7AA-D843-4F90-A253-5AE6E63A367D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {48DBB7AA-D843-4F90-A253-5AE6E63A367D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {48DBB7AA-D843-4F90-A253-5AE6E63A367D}.Release|Any CPU.Build.0 = Release|Any CPU + {33537DD8-9C65-4CA0-907B-4FD4D96895C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {33537DD8-9C65-4CA0-907B-4FD4D96895C1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {33537DD8-9C65-4CA0-907B-4FD4D96895C1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {33537DD8-9C65-4CA0-907B-4FD4D96895C1}.Release|Any CPU.Build.0 = Release|Any CPU + {F89CB77D-CE41-49A2-8648-2A0BE94EB010}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F89CB77D-CE41-49A2-8648-2A0BE94EB010}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F89CB77D-CE41-49A2-8648-2A0BE94EB010}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F89CB77D-CE41-49A2-8648-2A0BE94EB010}.Release|Any CPU.Build.0 = Release|Any CPU + {0C5A3DD1-CDF1-4928-BF4A-092B25AD9361}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0C5A3DD1-CDF1-4928-BF4A-092B25AD9361}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0C5A3DD1-CDF1-4928-BF4A-092B25AD9361}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0C5A3DD1-CDF1-4928-BF4A-092B25AD9361}.Release|Any CPU.Build.0 = Release|Any CPU + {B87E06A8-48DB-40C0-A491-754C4180C088}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B87E06A8-48DB-40C0-A491-754C4180C088}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B87E06A8-48DB-40C0-A491-754C4180C088}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B87E06A8-48DB-40C0-A491-754C4180C088}.Release|Any CPU.Build.0 = Release|Any CPU + {56136062-1D11-4CCF-9168-F356AFF568C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {56136062-1D11-4CCF-9168-F356AFF568C7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {56136062-1D11-4CCF-9168-F356AFF568C7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {56136062-1D11-4CCF-9168-F356AFF568C7}.Release|Any CPU.Build.0 = Release|Any CPU + {1CDC97AA-F24E-40CF-8816-056DB5AC3AB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1CDC97AA-F24E-40CF-8816-056DB5AC3AB9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1CDC97AA-F24E-40CF-8816-056DB5AC3AB9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1CDC97AA-F24E-40CF-8816-056DB5AC3AB9}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {3AD75577-44E2-434B-9D6E-47C248729E88} + EndGlobalSection +EndGlobal