aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework/NetworkUtil.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Framework/NetworkUtil.cs')
-rw-r--r--OpenSim/Framework/NetworkUtil.cs72
1 files changed, 72 insertions, 0 deletions
diff --git a/OpenSim/Framework/NetworkUtil.cs b/OpenSim/Framework/NetworkUtil.cs
index 5fe343d..7c30bd3 100644
--- a/OpenSim/Framework/NetworkUtil.cs
+++ b/OpenSim/Framework/NetworkUtil.cs
@@ -31,6 +31,7 @@ using System.Net.Sockets;
31using System.Net; 31using System.Net;
32using System.Net.NetworkInformation; 32using System.Net.NetworkInformation;
33using System.Reflection; 33using System.Reflection;
34using System.Text;
34using log4net; 35using log4net;
35 36
36namespace OpenSim.Framework 37namespace OpenSim.Framework
@@ -180,10 +181,14 @@ namespace OpenSim.Framework
180 throw new ArgumentException("[NetworkUtil] Unable to resolve defaultHostname to an IPv4 address for an IPv4 client"); 181 throw new ArgumentException("[NetworkUtil] Unable to resolve defaultHostname to an IPv4 address for an IPv4 client");
181 } 182 }
182 183
184 static IPAddress externalIPAddress;
185
183 static NetworkUtil() 186 static NetworkUtil()
184 { 187 {
185 try 188 try
186 { 189 {
190 externalIPAddress = GetExternalIP();
191
187 foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces()) 192 foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
188 { 193 {
189 foreach (UnicastIPAddressInformation address in ni.GetIPProperties().UnicastAddresses) 194 foreach (UnicastIPAddressInformation address in ni.GetIPProperties().UnicastAddresses)
@@ -244,5 +249,72 @@ namespace OpenSim.Framework
244 } 249 }
245 return defaultHostname; 250 return defaultHostname;
246 } 251 }
252
253 public static IPAddress GetExternalIPOf(IPAddress user)
254 {
255 // Check if we're accessing localhost.
256 foreach (IPAddress host in Dns.GetHostAddresses(Dns.GetHostName()))
257 {
258 if (host.Equals(user) && host.AddressFamily == AddressFamily.InterNetwork)
259 {
260 m_log.Info("[NetworkUtil] Localhost user detected, sending '" + externalIPAddress + "' instead of '" + user + "'");
261 return externalIPAddress;
262 }
263 }
264
265 // Check for same LAN segment
266 foreach (KeyValuePair<IPAddress, IPAddress> subnet in m_subnets)
267 {
268 byte[] subnetBytes = subnet.Value.GetAddressBytes();
269 byte[] localBytes = subnet.Key.GetAddressBytes();
270 byte[] destBytes = user.GetAddressBytes();
271
272 if (subnetBytes.Length != destBytes.Length || subnetBytes.Length != localBytes.Length)
273 return user;
274
275 bool valid = true;
276
277 for (int i = 0; i < subnetBytes.Length; i++)
278 {
279 if ((localBytes[i] & subnetBytes[i]) != (destBytes[i] & subnetBytes[i]))
280 {
281 valid = false;
282 break;
283 }
284 }
285
286 if (subnet.Key.AddressFamily != AddressFamily.InterNetwork)
287 valid = false;
288
289 if (valid)
290 {
291 m_log.Info("[NetworkUtil] Local LAN user detected, sending '" + externalIPAddress + "' instead of '" + user + "'");
292 return externalIPAddress;
293 }
294 }
295
296 // Otherwise, return user address
297 return user;
298 }
299
300 private static IPAddress GetExternalIP()
301 {
302 string whatIsMyIp = "http://www.whatismyip.com/automation/n09230945.asp";
303 WebClient wc = new WebClient();
304 UTF8Encoding utf8 = new UTF8Encoding();
305 string requestHtml = "";
306 try
307 {
308 requestHtml = utf8.GetString(wc.DownloadData(whatIsMyIp));
309 }
310 catch (WebException we)
311 {
312 // do something with exception
313 m_log.Info("[NetworkUtil]: Exception in GetExternalIP: " + we.ToString());
314 }
315
316 IPAddress externalIp = IPAddress.Parse(requestHtml);
317 return externalIp;
318 }
247 } 319 }
248} 320}