// This program shows how to use the IPAddress class to obtain a server
// IP addressess and related information.
#using <mscorlib.dll>
#using <System.dll>
using namespace System;
using namespace System::Net;
using namespace System::Net::Sockets;
using namespace System::Text::RegularExpressions;
/**
* The IPAddresses method obtains the selected server IP address information.
* It then displays the type of address family supported by the server and its
* IP address in standard and byte format.
**/
void IPAddresses(String* server)
{
try
{
System::Text::ASCIIEncoding* ASCII = new System::Text::ASCIIEncoding();
// Get server related information.
IPHostEntry* heserver = Dns::Resolve(server);
// Loop on the AddressList
System::Collections::IEnumerator* myEnum = heserver->AddressList->GetEnumerator();
while (myEnum->MoveNext())
{
IPAddress* curAdd = __try_cast<IPAddress*>(myEnum->Current);
// Display the type of address family supported by the server. If the
// server is IPv6-enabled this value is: InternNetworkV6. If the server
// is also IPv4-enabled there will be an additional value of InterNetwork.
Console::WriteLine(S"AddressFamily: {0}", __box(curAdd->AddressFamily));
// Display the ScopeId property in case of IPV6 addresses.
if(__box(curAdd->AddressFamily)->ToString() == __box(ProtocolFamily::InterNetworkV6)->ToString())
Console::WriteLine(S"Scope Id: {0}", __box(curAdd->ScopeId));
// Display the server IP address in the standard format. In
// IPv4 the format will be dotted-quad notation, in IPv6 it will be
// in in colon-hexadecimal notation.
Console::WriteLine(S"Address: {0}", curAdd);
// Display the server IP address in byte format.
Console::Write(S"AddressBytes: ");
Byte bytes[] = curAdd->GetAddressBytes();
for (int i = 0; i < bytes->Length; i++)
{
Console::Write(bytes[i]);
}
Console::WriteLine(S"\r\n");
}
}
catch (Exception* e)
{
Console::WriteLine(S"[DoResolve] Exception: {0}", e);
}
}
// This IPAddressAdditionalInfo displays additional server address information.
void IPAddressAdditionalInfo()
{
try
{
// Display the flags that show if the server supports IPv4 or IPv6
// address schemas.
Console::WriteLine(S"\r\nSupportsIPv4: {0}", __box(Socket::SupportsIPv4));
Console::WriteLine(S"SupportsIPv6: {0}", __box(Socket::SupportsIPv6));
if (Socket::SupportsIPv6)
{
// Display the server Any address. This IP address indicates that the server
// should listen for client activity on all network interfaces.
Console::WriteLine(S"\r\nIPv6Any: {0}", IPAddress::IPv6Any);
// Display the server loopback address.
Console::WriteLine(S"IPv6Loopback: {0}", IPAddress::IPv6Loopback);
// Used during autoconfiguration first phase.
Console::WriteLine(S"IPv6None: {0}", IPAddress::IPv6None);
Console::WriteLine(S"IsLoopback(IPv6Loopback): {0}", __box(IPAddress::IsLoopback(IPAddress::IPv6Loopback)));
}
Console::WriteLine(S"IsLoopback(Loopback): {0}", __box(IPAddress::IsLoopback(IPAddress::Loopback)));
}
catch (Exception* e)
{
Console::WriteLine(S"[IPAddresses] Exception: {0}", e);
}
}
int main()
{
String* args[] = Environment::GetCommandLineArgs();
String* server = 0;
// Define a regular expression to parse user's input.
// This is a security check. It allows only
// alphanumeric input string between 2 to 40 character long.
Regex* rex = new Regex(S"^[a-zA-Z]\\w{1,39}$");
if (args->Length < 2)
{
// If no server name is passed as an argument to this program, use the current
// server name as default.
server = Dns::GetHostName();
Console::WriteLine(S"Using current host: {0}", server);
}
else
{
server = args[1];
if (!(rex->Match(server))->Success)
{
Console::WriteLine(S"Input string format not allowed.");
return -1;
}
}
// Get the list of the addresses associated with the requested server.
IPAddresses(server);
// Get additonal address information.
IPAddressAdditionalInfo();
}