C#でコードを書いてみる。
コードを書くと言っても、実は全く難しいプロセスはない。ちょっとしたオプションをソケット(Socket)に対して指定するだけである。
Socket s = new Socket( AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp); // Teredoを有効にする const int IPV6_PROTECTION_LEVEL = 23; const int PROTECTION_LEVEL_UNRESTRICTED = 10; s.SetSocketOption( SocketOptionLevel.IPv6, (SocketOptionName)IPV6_PROTECTION_LEVEL, PROTECTION_LEVEL_UNRESTRICTED);
たったこれだけ。後は普通のコードと同じ。NATに守られているはずのマシンの情報がWANに漏れることになるので、セキュリティに関しては若干の注意が必要だが、この手軽さは捨てがたい魅力だ。
自分に割り当てられたTeredoのIPv6アドレスを取得する
普通はipconfig /allで確認することが出来るが、プログラムから取得するには、ちょっとだけ面倒なことをする必要がある。さらに、アダプタ詳細で判断して良いのかどうかは不明。
IPAddress GetTeredoIPv6Address() { if(!NetworkInterface.GetIsNetworkAvailable()) throw new ApplicationException("Network is not available!"); if(!Socket.OSSupportsIPv6) throw new ApplicationException("IPv6 not enabled!"); NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); if(nics == null || nics.Length == 0) throw new ApplicationException("No network interfaces found."); foreach(NetworkInterface adapter in nics) { if(!adapter.Supports(NetworkInterfaceComponent.IPv6)) continue; if(!adapter.Description.Contains("Teredo")) continue; IPInterfaceProperties props = adapter.GetIPProperties(); foreach(UnicastIPAddressInformation uiai in props.UnicastAddresses) { IPAddress addr = uiai.Address; if(addr.IsIPv6LinkLocal || addr.IsIPv6SiteLocal) continue; return addr; } } throw new ApplicationException("Teredo adapter is not found!"); return null; }