public void STUNSecondaryReceived(IPEndPoint localEndPoint, IPEndPoint receivedEndPoint, byte[] buffer, int bufferLength)
{
try
{
//Console.WriteLine("\n=> received from " + IPSocketAddress.GetSocketString(receivedEndPoint) + " on " + IPSocketAddress.GetSocketString(receivedOnEndPoint));
//Console.WriteLine(Utility.PrintBuffer(buffer));
STUNMessage stunRequest = STUNMessage.ParseSTUNMessage(buffer, bufferLength);
//Console.WriteLine(stunRequest.ToString());
FireSTUNSecondaryRequestInTraceEvent(localEndPoint, receivedEndPoint, stunRequest);
STUNMessage stunResponse = GetResponse(receivedEndPoint, stunRequest, true);
byte[] stunResponseBuffer = stunResponse.ToByteBuffer();
bool changeAddress = false;
bool changePort = false;
foreach (STUNAttribute attr in stunRequest.Attributes)
{
if (attr.AttributeType == STUNAttributeTypesEnum.ChangeRequest)
{
STUNChangeRequestAttribute changeReqAttr = (STUNChangeRequestAttribute)attr;
changeAddress = changeReqAttr.ChangeAddress;
changePort = changeReqAttr.ChangePort;
break;
}
}
if (!changeAddress)
{
if (!changePort)
{
//Console.WriteLine("<= sending to " + IPSocketAddress.GetSocketString(receivedEndPoint) + " from " + IPSocketAddress.GetSocketString(m_secondaryEndPoint));
m_secondarySend(receivedEndPoint, stunResponseBuffer);
FireSTUNSecondaryResponseOutTraceEvent(m_secondaryEndPoint, receivedEndPoint, stunResponse);
}
else
{
//Console.WriteLine("<= sending to " + IPSocketAddress.GetSocketString(receivedEndPoint) + " from " + IPSocketAddress.GetSocketString(m_secondaryDiffPortEndPoint));
m_secondaryDiffPortSocket.Send(stunResponseBuffer, stunResponseBuffer.Length, receivedEndPoint);
FireSTUNSecondaryResponseOutTraceEvent(m_secondaryDiffPortEndPoint, receivedEndPoint, stunResponse);
}
}
else
{
if (!changePort)
{
//Console.WriteLine("<= sending to " + IPSocketAddress.GetSocketString(receivedEndPoint) + " from " + IPSocketAddress.GetSocketString(m_primaryEndPoint));
m_primarySend(receivedEndPoint, stunResponseBuffer);
FireSTUNPrimaryResponseOutTraceEvent(m_primaryEndPoint, receivedEndPoint, stunResponse);
}
else
{
//Console.WriteLine("<= sending to " + IPSocketAddress.GetSocketString(receivedEndPoint) + " from " + IPSocketAddress.GetSocketString(m_primaryDiffPortEndPoint));
m_primaryDiffPortSocket.Send(stunResponseBuffer, stunResponseBuffer.Length, receivedEndPoint);
FireSTUNPrimaryResponseOutTraceEvent(m_primaryDiffPortEndPoint, receivedEndPoint, stunResponse);
}
}
}
catch (Exception excp)
{
logger.Debug("Exception STUNSecondaryReceived. " + excp.Message);
}
}