public void GotResponse(SIPEndPoint localSIPEndPoint, SIPEndPoint remoteEndPoint, SIPResponse sipResponse) { if (m_transactionState == SIPTransactionStatesEnum.Completed || m_transactionState == SIPTransactionStatesEnum.Confirmed) { FireTransactionTraceMessage("Received Duplicate Response " + localSIPEndPoint.ToString() + "<-" + remoteEndPoint + m_crLF + sipResponse.ToString()); if (sipResponse.Header.CSeqMethod == SIPMethodsEnum.INVITE) { if (sipResponse.StatusCode >= 100 && sipResponse.StatusCode <= 199) { // Ignore info response on completed transaction. } else { ResendAckRequest(); } } TransactionDuplicateResponse?.Invoke(localSIPEndPoint, remoteEndPoint, this, sipResponse); } else { FireTransactionTraceMessage("Received Response " + localSIPEndPoint.ToString() + "<-" + remoteEndPoint + m_crLF + sipResponse.ToString()); if (sipResponse.StatusCode >= 100 && sipResponse.StatusCode <= 199) { UpdateTransactionState(SIPTransactionStatesEnum.Proceeding); if (sipResponse.Header.CSeqMethod == SIPMethodsEnum.INVITE) { //ignore the respose of 100 trying } else { TransactionInformationResponseReceived?.Invoke(localSIPEndPoint, remoteEndPoint, this, sipResponse); } } else { m_transactionFinalResponse = sipResponse; UpdateTransactionState(SIPTransactionStatesEnum.Completed); TransactionFinalResponseReceived?.Invoke(localSIPEndPoint, remoteEndPoint, this, sipResponse); } } }
void transport_SIPBadRequestInTraceEvent(SIPEndPoint localEndPoint, SIPEndPoint fromEndPoint, string message, SIPValidationFieldsEnum errorField, string rawMessage) { Console.WriteLine("Bad Request: " + localEndPoint + "<-" + fromEndPoint.ToString() + " " + errorField + "." + message + "\n" + rawMessage); }
void transport_SIPRequestInTraceEvent(SIPEndPoint localEndPoint, SIPEndPoint fromEndPoint, SIPRequest sipRequest) { Console.WriteLine("Request In: " + localEndPoint + "<-" + fromEndPoint.ToString() + "\n" + sipRequest.ToString()); }
void transport_SIPRequestOutTraceEvent(SIPEndPoint localEndPoint, SIPEndPoint toEndPoint, SIPRequest sipRequest) { Console.WriteLine("Request Out: " + localEndPoint + "->" + toEndPoint.ToString() + "\n" + sipRequest.ToString()); }
void transport_UnrecognisedMessageReceived(SIPEndPoint localEndPoint, SIPEndPoint fromEndPoint, byte[] buffer) { Console.WriteLine("Unrecognised: " + localEndPoint + "<-" + fromEndPoint.ToString() + " " + buffer.Length + " bytes."); }
/// <summary> /// Periodically checks the established connections and closes any that have not had a transmission for a specified /// period or where the number of connections allowed per IP address has been exceeded. Only relevant for connection /// oriented channels such as TCP and TLS. /// </summary> protected void PruneConnections(string threadName) { try { Thread.CurrentThread.Name = threadName; Thread.Sleep(INITIALPRUNE_CONNECTIONS_DELAY); while (!Closed) { bool checkComplete = false; while (!checkComplete) { try { SIPConnection inactiveConnection = null; Dictionary <string, SIPConnection> connections = GetConnectionsList(); lock (connections) { var inactiveConnectionKey = (from connection in connections where connection.Value.LastTransmission < DateTime.Now.AddMinutes(PRUNE_NOTRANSMISSION_MINUTES * -1) select connection.Key).FirstOrDefault(); if (inactiveConnectionKey != null) { inactiveConnection = connections[inactiveConnectionKey]; connections.Remove(inactiveConnectionKey); } } if (inactiveConnection != null) { logger.Debug("Pruning inactive connection on " + SIPChannelContactURI + " to remote end point " + inactiveConnection.RemoteEndPoint.ToString() + "."); inactiveConnection.Close(); } else { checkComplete = true; } } catch (SocketException) { // Will be thrown if the socket is already closed. } catch (Exception pruneExcp) { logger.Error("Exception PruneConnections (pruning). " + pruneExcp.Message); checkComplete = true; } } Thread.Sleep(PRUNE_CONNECTIONS_INTERVAL); checkComplete = false; } logger.Debug("SIPChannel socket on " + m_localSIPEndPoint.ToString() + " pruning connections halted."); } catch (Exception excp) { logger.Error("Exception SIPChannel PruneConnections. " + excp.Message); } }
private void UACInviteTransaction_TransactionRequestReceived(SIPEndPoint localSIPEndPoint, SIPEndPoint remoteEndPoint, SIPTransaction sipTransaction, SIPRequest sipRequest) { logger.Warn("UACInviteTransaction received unexpected request, " + sipRequest.Method + " from " + remoteEndPoint.ToString() + ", ignoring."); }
public void SendRequest(SIPRequest sipRequest) { SIPEndPoint dstEndPoint = m_sipTransport.GetRequestEndPoint(sipRequest, OutboundProxy, true).GetSIPEndPoint(); if (dstEndPoint != null) { FireTransactionTraceMessage("Send Request " + LocalSIPEndPoint.ToString() + "->" + dstEndPoint.ToString() + m_crLF + sipRequest.ToString()); if (sipRequest.Method == SIPMethodsEnum.ACK) { m_ackRequest = sipRequest; m_ackRequestIPEndPoint = dstEndPoint; } else { RemoteEndPoint = dstEndPoint; } m_sipTransport.SendRequest(dstEndPoint, sipRequest); } else { throw new ApplicationException("Could not send Transaction Request as request end point could not be determined.\r\n" + sipRequest.ToString()); } }
public void GotRequest(SIPEndPoint localSIPEndPoint, SIPEndPoint remoteEndPoint, SIPRequest sipRequest) { FireTransactionTraceMessage("Received Request " + localSIPEndPoint.ToString() + "<-" + remoteEndPoint.ToString() + m_crLF + sipRequest.ToString()); TransactionRequestReceived?.Invoke(localSIPEndPoint, remoteEndPoint, this, sipRequest); }