/// <summary> /// Sends or resends the transaction request. /// </summary> /// <param name="transaction">The transaction to resend the request for.</param> /// <returns>The result of the send attempt.</returns> private Task <SocketError> SendTransactionRequest(SIPTransaction transaction) { Task <SocketError> result = null; transaction.Retransmits = transaction.Retransmits + 1; transaction.LastTransmit = DateTime.Now; if (transaction.InitialTransmit == DateTime.MinValue) { transaction.InitialTransmit = transaction.LastTransmit; } // INVITE-UAC and no-INVITE transaction types, send request reliably. if (transaction.Retransmits > 1) { SIPRequestRetransmitTraceEvent?.Invoke(transaction, transaction.TransactionRequest, transaction.Retransmits); transaction.RequestRetransmit(); } // If there is no tx request then it must be a PRack request we're being asked to send reliably. SIPRequest req = transaction.TransactionRequest ?? transaction.PRackRequest; if (transaction.OutboundProxy != null) { result = m_sipTransport.SendRequestAsync(transaction.OutboundProxy, req); } else { result = m_sipTransport.SendRequestAsync(req); } return(result); }
/// <summary> /// Sends or resends the transaction request. /// </summary> /// <param name="transaction">The transaction to resend the request for.</param> /// <returns>The result of the send attempt.</returns> private Task <SocketError> SendTransactionRequest(SIPTransaction transaction) { Task <SocketError> result = null; transaction.Retransmits = transaction.Retransmits + 1; transaction.LastTransmit = DateTime.Now; if (transaction.InitialTransmit == DateTime.MinValue) { transaction.InitialTransmit = transaction.LastTransmit; } // INVITE-UAC and no-INVITE transaction types, send request reliably. if (transaction.Retransmits > 1 && !DisableRetransmitSending) { SIPRequestRetransmitTraceEvent?.Invoke(transaction, transaction.TransactionRequest, transaction.Retransmits); transaction.RequestRetransmit(); } if (transaction.Retransmits > 1 && DisableRetransmitSending) { return(Task.FromResult(SocketError.Success)); } else { // If there is no transaction request then it must be a PRack request we're being asked // to send reliably. SIPRequest req = transaction.TransactionRequest ?? transaction.PRackRequest; if (transaction.OutboundProxy != null) { result = m_sipTransport.SendRequestAsync(transaction.OutboundProxy, req); } else { // If retransmits are disabled we must wait for DNS when sending. By default the DNS lookup mechanism // will silently do nothing if the lookup result is not in the cache and relies on the result // being ready for a subsequent SIP retransmit. This mechanism won't work if SIP retransmits are disabled. bool waitForDns = DisableRetransmitSending; result = m_sipTransport.SendRequestAsync(req, waitForDns); } return(result); } }