private void SendNATKeepAlives()
{
try
{
Thread.CurrentThread.Name = SEND_KEEPALIVES_THREAD_NAME;
while (!m_stop)
{
try
{
//List<NATKeepAliveJob> m_jobsList = m_natKeepAliveJobs.Values.ToList();
List<string> jobsToRemove = new List<string>();
DateTime natKeepAliveStart = DateTime.Now;
int natKeepAliveCount = 0;
// Send NAT keep-alives.
//for (int index = 0; index < m_jobsList.Count; index++) {
m_natKeepAliveJobs.Values.ToList().ForEach((job) =>
{
//NATKeepAliveJob job = m_jobsList[index];
try
{
if (job.EndTime < DateTime.Now || job.Cancel)
{
if (!jobsToRemove.Contains(job.RemoteEndPoint.ToString()))
{
logger.Debug("Removing NAT keep-alive job for binding socket " + job.RemoteEndPoint.ToString() + ".");
jobsToRemove.Add(job.RemoteEndPoint.ToString());
}
}
else if (job.NextSendTime == null || job.NextSendTime < DateTime.Now)
{
SendNATKeepAlive_External(new NATKeepAliveMessage(job.ProxyEndPoint, job.RemoteEndPoint.GetIPEndPoint()));
job.NextSendTime = DateTime.Now.AddSeconds(NATKEEPALIVE_DEFAULTSEND_INTERVAL);
//logger.Debug("Requesting NAT keep-alive from proxy socket " + job.ProxyEndPoint.ToString() + " to " + job.RemoteEndPoint + ", owner=" + job.Owner + ".");
FireSIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.NATKeepAlive, SIPMonitorEventTypesEnum.NATKeepAlive, "Requesting NAT keep-alive from proxy socket " + job.ProxyEndPoint + " to " + job.RemoteEndPoint + ".", job.Owner));
//if (m_natKeepAliveJobs.ContainsKey(job.RemoteEndPoint.ToString()))
//{
// m_natKeepAliveJobs[job.BindingId] = job;
//}
natKeepAliveCount++;
}
}
catch (Exception natJobExcp)
{
logger.Error("Exception attempting NAT keep-alive send for " + job.RemoteEndPoint + ", owner=" + job.Owner + ". " + natJobExcp.Message);
if (!jobsToRemove.Contains(job.RemoteEndPoint.ToString()))
{
jobsToRemove.Add(job.RemoteEndPoint.ToString());
}
}
});
// Remove any flagged jobs.
foreach (string removeJob in jobsToRemove)
{
m_natKeepAliveJobs.Remove(removeJob);
}
//logger.Debug(natKeepAliveCount + " NAT keep-alives sent, time taken " + DateTime.Now.Subtract(natKeepAliveStart).TotalMilliseconds.ToString("0") + "ms.");
//FireSIPMonitorLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Registrar, SIPMonitorEventTypesEnum.Timing, "NATKeepAlive run took " + DateTime.Now.Subtract(natKeepAliveStart).TotalMilliseconds.ToString("0") + "ms.", null));
}
catch (Exception sendExcp)
{
logger.Error("Exception SendNATKeepAlives Send. " + sendExcp.Message);
}
Thread.Sleep(SEND_NATKEEPALIVES_INTERVAL);
}
}
catch (Exception excp)
{
logger.Error("Exception SendNATKeepAlives. " + excp.Message);
}
}