public static IPEndPoint GetChangedAddressAttribute(StunMessage5389 response) { var changedAddressAttribute = response?.Attributes.FirstOrDefault(t => t.Type == AttributeType.ChangedAddress); if (changedAddressAttribute == null) { return(null); } var address = (ChangedAddressAttribute)changedAddressAttribute.Value; return(new IPEndPoint(address.Address, address.Port)); }
public static IPEndPoint GetMappedAddressAttribute(StunMessage5389 response) { var mappedAddressAttribute = response?.Attributes.FirstOrDefault(t => t.Type == AttributeType.MappedAddress); if (mappedAddressAttribute == null) { return(null); } var mapped = (MappedAddressAttribute)mappedAddressAttribute.Value; return(new IPEndPoint(mapped.Address, mapped.Port)); }
public static IPEndPoint?GetXorMappedAddressAttribute(this StunMessage5389 response) { var mappedAddressAttribute = response.Attributes.FirstOrDefault(t => t.Type == AttributeType.XorMappedAddress) ?? response.Attributes.FirstOrDefault(t => t.Type == AttributeType.MappedAddress); if (mappedAddressAttribute is null) { return(null); } var mapped = (AddressStunAttributeValue)mappedAddressAttribute.Value; return(new IPEndPoint(mapped.Address !, mapped.Port)); }
public static IPEndPoint?GetOtherAddressAttribute(this StunMessage5389 response) { var addressAttribute = response.Attributes.FirstOrDefault(t => t.Type == AttributeType.OtherAddress) ?? response.Attributes.FirstOrDefault(t => t.Type == AttributeType.ChangedAddress); if (addressAttribute is null) { return(null); } var address = (AddressStunAttributeValue)addressAttribute.Value; return(new IPEndPoint(address.Address !, address.Port)); }
private async Task <StunResult5389> BindingTestBaseAsync(IPEndPoint remote, bool notifyChanged, CancellationToken token) { BindingTestResult res; var test = new StunMessage5389 { StunMessageType = StunMessageType.BindingRequest }; var(response1, _, local1) = await TestAsync(test, remote, remote, token); var mappedAddress1 = AttributeExtensions.GetXorMappedAddressAttribute(response1); var otherAddress = AttributeExtensions.GetOtherAddressAttribute(response1); var local = local1 == null ? null : new IPEndPoint(local1, LocalEndPoint.Port); if (response1 == null) { res = BindingTestResult.Fail; } else if (mappedAddress1 == null) { res = BindingTestResult.UnsupportedServer; } else { res = BindingTestResult.Success; } if (notifyChanged) { _bindingSubj.OnNext(res); PubSubj.OnNext(mappedAddress1); } LocalSubj.OnNext(LocalEndPoint); return(new StunResult5389 { BindingTestResult = res, LocalEndPoint = local, PublicEndPoint = mappedAddress1, OtherEndPoint = otherAddress }); }
private async Task <StunResult5389> FilteringBehaviorTestBaseAsync(CancellationToken token) { // test I var result1 = await BindingTestBaseAsync(RemoteEndPoint, true, token); try { if (result1.BindingTestResult != BindingTestResult.Success) { return(result1); } if (result1.OtherEndPoint == null || Equals(result1.OtherEndPoint.Address, RemoteEndPoint.Address) || result1.OtherEndPoint.Port == RemoteEndPoint.Port) { result1.FilteringBehavior = FilteringBehavior.UnsupportedServer; return(result1); } // test II var test2 = new StunMessage5389 { StunMessageType = StunMessageType.BindingRequest, Attributes = new[] { AttributeExtensions.BuildChangeRequest(true, true) } }; var(response2, _, _) = await TestAsync(test2, RemoteEndPoint, result1.OtherEndPoint, token); if (response2 != null) { result1.FilteringBehavior = FilteringBehavior.EndpointIndependent; return(result1); } // test III var test3 = new StunMessage5389 { StunMessageType = StunMessageType.BindingRequest, Attributes = new[] { AttributeExtensions.BuildChangeRequest(false, true) } }; var(response3, remote3, _) = await TestAsync(test3, RemoteEndPoint, RemoteEndPoint, token); if (response3 == null) { result1.FilteringBehavior = FilteringBehavior.AddressAndPortDependent; return(result1); } if (Equals(remote3.Address, RemoteEndPoint.Address) && remote3.Port != RemoteEndPoint.Port) { result1.FilteringBehavior = FilteringBehavior.AddressAndPortDependent; } else { result1.FilteringBehavior = FilteringBehavior.UnsupportedServer; } return(result1); } finally { _filteringBehaviorSubj.OnNext(result1.FilteringBehavior); } }