Example #1
0
 public SIPEndPoint(SIPProtocolsEnum protocol, IPEndPoint endPoint, string channelID, string connectionID)
 {
     Protocol     = protocol;
     Address      = endPoint.Address;
     Port         = (endPoint.Port == 0) ? SIPConstants.GetDefaultPort(Protocol) : endPoint.Port;
     ChannelID    = channelID;
     ConnectionID = connectionID;
 }
Example #2
0
        /// <summary>
        /// Instantiates a new SIP end point.
        /// </summary>
        /// <param name="protocol">The SIP transport/application protocol used for the transmission.</param>
        /// <param name="address">The network address.</param>
        /// <param name="port">The network port.</param>
        /// <param name="channelID">Optional. The unique ID of the channel that created the end point.</param>
        /// <param name="connectionID">Optional. For connection oriented protocols the unique ID of the connection.
        /// For connectionless protocols should be set to null.</param>
        public SIPEndPoint(SIPProtocolsEnum protocol, IPAddress address, int port, string channelID, string connectionID)
        {
            Protocol = protocol;
            Address  = address?.IsIPv4MappedToIPv6 == true?address.MapToIPv4() : address;

            Port         = (port == 0) ? SIPConstants.GetDefaultPort(Protocol) : port;
            ChannelID    = channelID;
            ConnectionID = connectionID;
        }
        /// <summary>
        /// Creates a SIP channel to establish outbound connections and send SIP messages
        /// over a web socket communications layer.
        /// </summary>
        public SIPClientWebSocketChannel() : base()
        {
            IsReliable  = true;
            SIPProtocol = SIPProtocolsEnum.ws;

            // TODO: These values need to be adjusted. The problem is the source end point isn't available from
            // the client web socket connection.
            ListeningIPAddress = IPAddress.Any;
            Port = SIPConstants.GetDefaultPort(SIPProtocol);
        }
Example #4
0
        public SIPEndPoint(SIPURI sipURI)
        {
            Protocol = sipURI.Protocol;

            if (!IPSocket.TryParseIPEndPoint(sipURI.Host, out var endPoint))
            {
                throw new ApplicationException($"Could not parse SIPURI host {sipURI.Host} as an IP end point.");
            }

            Address = endPoint.Address;
            Port    = (endPoint.Port == 0) ? SIPConstants.GetDefaultPort(Protocol) : endPoint.Port;
        }
Example #5
0
 public SIPEndPoint ToSIPEndPoint()
 {
     if (IPSocket.TryParseIPEndPoint(Host, out var ipEndPoint))
     {
         if (ipEndPoint.Port != 0)
         {
             return(new SIPEndPoint(Protocol, ipEndPoint));
         }
         else
         {
             ipEndPoint.Port = SIPConstants.GetDefaultPort(Protocol);
             return(new SIPEndPoint(Protocol, ipEndPoint));
         }
     }
     else
     {
         return(null);
     }
 }
Example #6
0
        /// <summary>
        /// Attempts a lookup from DNS.
        /// </summary>
        /// <param name="uri"></param>
        /// <param name="startQuery"></param>
        /// <param name="preferIPv6"></param>
        /// <param name="ct"></param>
        /// <returns></returns>
        private static async Task <SIPEndPoint> SIPLookupAsync(
            SIPURI uri,
            QueryType startQuery,
            bool preferIPv6,
            CancellationToken ct)
        {
            SIPEndPoint result    = null;
            QueryType   queryType = startQuery;

            string host = uri.MAddrOrHostAddress;
            int    port = SIPConstants.GetDefaultPort(uri.Protocol);

            if (ushort.TryParse(uri.HostPort, out var uriPort))
            {
                port = uriPort;
            }

            bool isDone = false;

            while (!isDone && !ct.IsCancellationRequested)
            {
                switch (queryType)
                {
                case QueryType.SRV:

                    try
                    {
                        var srvProtocol = SIPServices.GetSRVProtocolForSIPURI(uri);
                        //string serviceHost = DnsQueryExtensions.ConcatResolveServiceName(uri.MAddrOrHostAddress, uri.Scheme.ToString(), srvProtocol.ToString());
                        //var srvResult = await _lookupClient.QueryAsync(serviceHost, QueryType.SRV, QueryClass.IN, ct).ConfigureAwait(false);
                        var srvResult = await _lookupClient.ResolveServiceAsync(uri.MAddrOrHostAddress,
                                                                                uri.Scheme.ToString(), srvProtocol.ToString());

                        (var srvHost, var srvPort) = GetHostAndPortFromSrvResult(srvResult);
                        if (srvHost != null)
                        {
                            host = srvHost;
                            port = srvPort != 0 ? srvPort : port;
                        }
                    }
                    catch (Exception srvExcp)
                    {
                        logger.LogWarning($"SIPDNS exception on SRV lookup. {srvExcp.Message}.");
                    }

                    queryType = preferIPv6 ? QueryType.AAAA : QueryType.A;

                    break;

                case QueryType.AAAA:

                    try
                    {
                        var aaaaResult = await _lookupClient
                                         .QueryAsync(host, UseANYLookups?QueryType.ANY : QueryType.AAAA, QueryClass.IN, ct)
                                         .ConfigureAwait(false);

                        if (aaaaResult?.Answers?.Count > 0)
                        {
                            result = GetFromLookupResult(uri.Protocol,
                                                         aaaaResult.Answers.AddressRecords().OrderByDescending(x => x.RecordType).First(),
                                                         port);
                            isDone = true;
                        }
                        else
                        {
                            queryType = QueryType.A;
                        }
                    }
                    catch (Exception srvExcp)
                    {
                        logger.LogWarning($"SIPDNS exception on AAAA lookup. {srvExcp.Message}.");
                        queryType = QueryType.A;
                    }

                    break;

                default:
                    // A record lookup.
                    try
                    {
                        var aResult = await _lookupClient.QueryAsync(host, QueryType.A, QueryClass.IN, ct)
                                      .ConfigureAwait(false);

                        if (aResult != null)
                        {
                            if (aResult.Answers?.Count > 0)
                            {
                                result = GetFromLookupResult(uri.Protocol, aResult.Answers.AddressRecords().First(),
                                                             port);
                            }
                            else
                            {
                                // We got a result back but it was empty indicating an unresolvable host or
                                // some other DNS error condition.
                                result = SIPEndPoint.Empty;
                            }
                        }
                    }
                    catch (Exception srvExcp)
                    {
                        logger.LogWarning($"SIPDNS exception on A lookup. {srvExcp.Message}.");
                        result = SIPEndPoint.Empty;
                    }

                    isDone = true;
                    break;
                }
            }

            return(result);
        }
Example #7
0
 public SIPEndPoint(SIPProtocolsEnum protocol, IPEndPoint endPoint)
 {
     Protocol = protocol;
     Address  = endPoint.Address;
     Port     = (endPoint.Port == 0) ? SIPConstants.GetDefaultPort(Protocol) : endPoint.Port;
 }
Example #8
0
        /// <summary>
        /// Attempts a lookup from cache.
        /// </summary>
        /// <param name="uri"></param>
        /// <param name="startQuery"></param>
        /// <param name="preferIPv6"></param>
        /// <returns></returns>
        private static SIPEndPoint SIPLookupFromCache(
            SIPURI uri,
            QueryType startQuery,
            bool preferIPv6)
        {
            SIPEndPoint result    = null;
            QueryType   queryType = startQuery;

            string host = uri.MAddrOrHostAddress;
            int    port = SIPConstants.GetDefaultPort(uri.Protocol);

            if (ushort.TryParse(uri.HostPort, out var uriPort))
            {
                port = uriPort;
            }

            bool isDone = false;

            while (!isDone)
            {
                switch (queryType)
                {
                case QueryType.SRV:

                    var    srvProtocol = SIPServices.GetSRVProtocolForSIPURI(uri);
                    string serviceHost = DnsQueryExtensions.ConcatServiceName(uri.MAddrOrHostAddress, uri.Scheme.ToString(), srvProtocol.ToString());
                    var    srvResult   = _lookupClient.QueryCache(serviceHost, QueryType.SRV);
                    (var srvHost, var srvPort) = GetHostAndPortFromSrvResult(srvResult);
                    if (srvHost != null)
                    {
                        host = srvHost;
                        port = srvPort != 0 ? srvPort : port;
                    }
                    queryType = preferIPv6 ? QueryType.AAAA : QueryType.A;

                    break;

                case QueryType.AAAA:

                    var aaaaResult = _lookupClient.QueryCache(host, UseANYLookups ? QueryType.ANY : QueryType.AAAA, QueryClass.IN);
                    if (aaaaResult?.Answers?.Count > 0)
                    {
                        result = GetFromLookupResult(uri.Protocol, aaaaResult.Answers.OrderByDescending(x => x.RecordType).First(), port);
                        isDone = true;
                    }
                    else
                    {
                        queryType = QueryType.A;
                    }

                    break;

                default:
                    // A record lookup.

                    var aResult = _lookupClient.QueryCache(host, QueryType.A, QueryClass.IN);
                    if (aResult != null)
                    {
                        if (aResult.Answers?.Count > 0)
                        {
                            result = GetFromLookupResult(uri.Protocol, aResult.Answers.First(), port);
                        }
                        else
                        {
                            // We got a result back but it was empty indicating an unresolvable host or
                            // some other DNS error condition.
                            result = SIPEndPoint.Empty;
                        }
                    }

                    isDone = true;
                    break;
                }
            }

            return(result);
        }