Skip to content

Commit

Permalink
Don't guess which local address needs to be used - we now know we sho…
Browse files Browse the repository at this point in the history
…uld use the one that the socket is bound to.

svn path=/trunk/Mono.Nat/; revision=134570
  • Loading branch information
alanmcgovern committed May 21, 2009
1 parent 19706de commit 5844844
Show file tree
Hide file tree
Showing 5 changed files with 12 additions and 9 deletions.
2 changes: 1 addition & 1 deletion src/Mono.Nat/ISearcher.cs
Expand Up @@ -15,7 +15,7 @@ internal interface ISearcher

void Search(UdpClient client);
IPEndPoint SearchEndpoint { get; }
void Handle(byte[] response, IPEndPoint endpoint);
void Handle(IPAddress localAddress, byte[] response, IPEndPoint endpoint);
DateTime NextSearch { get; }
}
}
6 changes: 4 additions & 2 deletions src/Mono.Nat/NatUtility.cs
Expand Up @@ -118,12 +118,13 @@ private static void SearchAndListen()
{
foreach (UdpClient client in clients)
{
IPAddress localAddress = ((IPEndPoint) client.Client.LocalEndPoint).Address;
if (client.Available > 0)
{
byte[] data = client.Receive(ref received);

foreach (ISearcher s in controllers)
s.Handle(data, received);
s.Handle(localAddress, data, received);
continue;
}
}
Expand Down Expand Up @@ -155,7 +156,8 @@ public static void StopDiscovery ()
controllers.Clear();
searching = false;
}


[Obsolete ("This method serves no purpose and shouldn't be used")]
public static IPAddress[] GetLocalAddresses (bool includeIPv6)
{
List<IPAddress> addresses = new List<IPAddress> ();
Expand Down
2 changes: 1 addition & 1 deletion src/Mono.Nat/PmpSearcher.cs
Expand Up @@ -46,7 +46,7 @@ public IPEndPoint SearchEndpoint
get { return searchEndpoint; }
}

public void Handle(byte[] response, IPEndPoint endpoint)
public void Handle(IPAddress localAddress, byte[] response, IPEndPoint endpoint)
{
if (!endpoint.Address.Equals(searchEndpoint.Address))
return;
Expand Down
6 changes: 4 additions & 2 deletions src/Mono.Nat/Upnp/UpnpNatDevice.cs
Expand Up @@ -38,6 +38,7 @@ namespace Mono.Nat.Upnp
public sealed class UpnpNatDevice : AbstractNatDevice, IEquatable<UpnpNatDevice>
{
private EndPoint hostEndPoint;
private IPAddress localAddress;
private string serviceDescriptionUrl;
private string controlUrl;
private string serviceType;
Expand All @@ -47,9 +48,10 @@ public sealed class UpnpNatDevice : AbstractNatDevice, IEquatable<UpnpNatDevice>
/// </summary>
private NatDeviceCallback callback;

internal UpnpNatDevice (string deviceDetails, string serviceType)
internal UpnpNatDevice (IPAddress localAddress, string deviceDetails, string serviceType)
{
this.LastSeen = DateTime.Now;
this.localAddress = localAddress;

// Split the string at the "location" section so i can extract the ipaddress and service description url
string locationDetails = deviceDetails.Substring(deviceDetails.IndexOf("Location", StringComparison.InvariantCultureIgnoreCase) + 9).Split('\r')[0];
Expand Down Expand Up @@ -141,7 +143,7 @@ public override IAsyncResult BeginGetExternalIP(AsyncCallback callback, object a
/// </summary>
public override IAsyncResult BeginCreatePortMap(Mapping mapping, AsyncCallback callback, object asyncState)
{
CreatePortMappingMessage message = new CreatePortMappingMessage(mapping, NatUtility.GetLocalAddresses(false)[0], this);
CreatePortMappingMessage message = new CreatePortMappingMessage(mapping, localAddress, this);
return BeginMessageInternal(message, callback, mapping, EndCreatePortMapInternal);
}

Expand Down
5 changes: 2 additions & 3 deletions src/Mono.Nat/UpnpSearcher.cs
Expand Up @@ -40,7 +40,7 @@ public IPEndPoint SearchEndpoint
get { return searchEndpoint; }
}

public void Handle(byte[] response, IPEndPoint endpoint)
public void Handle(IPAddress localAddress, byte[] response, IPEndPoint endpoint)
{
// Convert it to a string for easy parsing
string dataString = null;
Expand All @@ -57,7 +57,6 @@ public void Handle(byte[] response, IPEndPoint endpoint)
// Technically i should be checking for WANIPConnection:1 and InternetGatewayDevice:1
// but there are some routers missing the '1'.
string log = "UPnP Response: Router advertised a '{0}' service";
string serviceType = null;
StringComparison c = StringComparison.OrdinalIgnoreCase;
if (dataString.IndexOf("urn:schemas-upnp-org:service:WANIPConnection:", c) != -1)
NatUtility.Log(log, "urn:schemas-upnp-org:service:WANIPConnection:");
Expand All @@ -69,7 +68,7 @@ public void Handle(byte[] response, IPEndPoint endpoint)
return;

// We have an internet gateway device now
UpnpNatDevice d = new UpnpNatDevice(dataString, WanIPUrn);
UpnpNatDevice d = new UpnpNatDevice(localAddress, dataString, WanIPUrn);

if (this.devices.Contains(d))
{
Expand Down

0 comments on commit 5844844

Please sign in to comment.