コード例 #1
0
        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);
            }
        }