I've been crawling in the web for about 5 hours now and couldn't find a solution for my problem:
My company is developing an educational game and I'm writing an autoupdater for it using Monotorrent. The game will be used in schools, but because most schools only have very weak internet connections there should only be one computer in the network that downloads from a httpseeder, and the others should leech from the one computer that is downloading from the httpseed.
So I get loads of IP-addresses from the tracker and need to filter out only the ones that are in the LAN.
Of course schools are sometimes quite strict with firewalls and there will be loads of routers and switches between some computers in a school.
I've already tried most solutions, things like
NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface iface in interfaces)
{
IPInterfaceProperties properties = iface.GetIPProperties();
foreach (UnicastIPAddressInformation address in properties.UnicastAddresses)
{
Console.WriteLine(
"{0} (Mask: {1})",
address.Address,
address.IPv4Mask
);
}
}
Or similar techniques only deliver the information of the router/switch/whatever.
So in a nutshell, what I want to do is check if a given IP is accessible via LAN.
I'd really appreciate any help because this feature is the last one remaining :)
One thing that you could possibly use is to try and communicate between clients using multicast. Most firewalls and routers would block multicast traffic (and ISPs most definitely), meaning that you wouldn't be able to join a multicast group if no other client is on the lan. A dumb switch would pass on the traffic, a layer 3-switch might block it, or could allow it depending on configuration. Either way, if the layer 3 switch block it, you are probably on different subnets altogether anyway so all other options would fail as well.
One technology that comes to mind is SSDP ( http://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol ) which would serve your purpose pretty good I believe. That way you don't really need to figure out if you are on a LAN or not, just search for another node that is actively downloading, if you can't find one, start downloading yourself.
Since SSDP is a standard used in uPnP you would probably be able to find decent implementations you could work with.
Typically any IPs like 10.x.x.x (Class A) or 192.x.x.x (Class C) can be safely assumed to be inside a private local area network. IP Classications
You could take advantage of TTL. With a TTL of 1 the packet won't be able to make it to the internet:
However, remember that it is called an IPv4 mask for a reason - you can use it as one (so here is your algorithmic solution):