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; }
/// <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); }
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; }
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); } }
/// <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); }
public SIPEndPoint(SIPProtocolsEnum protocol, IPEndPoint endPoint) { Protocol = protocol; Address = endPoint.Address; Port = (endPoint.Port == 0) ? SIPConstants.GetDefaultPort(Protocol) : endPoint.Port; }
/// <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); }