private void RTPReceive()
{
try
{
Thread.CurrentThread.Name = "rtpchanrecv-" + _rtpPort;
byte[] buffer = new byte[2048];
while (!_isClosed)
{
try
{
int bytesRead = _rtpSocket.Receive(buffer);
if (bytesRead > 0)
{
_rtpSocket.SendTo(buffer, bytesRead, SocketFlags.None, _wiresharkEP);
_rtpLastActivityAt = DateTime.Now;
if (bytesRead > RTPHeader.MIN_HEADER_LEN)
{
if ((buffer[0] & 0x80) == 0)
{
#region STUN Packet.
//if (_iceState != null)
//{
// try
// {
// STUNv2Message stunMessage = STUNv2Message.ParseSTUNMessage(buffer, bytesRead);
// //logger.Debug("STUN message received from Receiver Client @ " + stunMessage.Header.MessageType + ".");
// if (stunMessage.Header.MessageType == STUNv2MessageTypesEnum.BindingRequest)
// {
// //logger.Debug("Sending STUN response to Receiver Client @ " + remoteEndPoint + ".");
// STUNv2Message stunResponse = new STUNv2Message(STUNv2MessageTypesEnum.BindingSuccessResponse);
// stunResponse.Header.TransactionId = stunMessage.Header.TransactionId;
// stunResponse.AddXORMappedAddressAttribute(_remoteEndPoint.Address, _remoteEndPoint.Port);
// byte[] stunRespBytes = stunResponse.ToByteBufferStringKey(_iceState.SenderPassword, true);
// _rtpSocket.SendTo(stunRespBytes, _remoteEndPoint);
// //logger.Debug("Sending Binding request to Receiver Client @ " + remoteEndPoint + ".");
// STUNv2Message stunRequest = new STUNv2Message(STUNv2MessageTypesEnum.BindingRequest);
// stunRequest.Header.TransactionId = Guid.NewGuid().ToByteArray().Take(12).ToArray();
// stunRequest.AddUsernameAttribute(_iceState.ReceiverUser + ":" + _iceState.SenderUser);
// stunRequest.Attributes.Add(new STUNv2Attribute(STUNv2AttributeTypesEnum.Priority, new byte[] { 0x6e, 0x7f, 0x1e, 0xff }));
// byte[] stunReqBytes = stunRequest.ToByteBufferStringKey(_iceState.ReceiverPassword, true);
// _rtpSocket.SendTo(stunReqBytes, _remoteEndPoint);
// _iceState.LastSTUNMessageReceivedAt = DateTime.Now;
// }
// else if (stunMessage.Header.MessageType == STUNv2MessageTypesEnum.BindingSuccessResponse)
// {
// if (!_iceState.IsSTUNExchangeComplete)
// {
// _iceState.IsSTUNExchangeComplete = true;
// logger.Debug("WebRTC client STUN exchange complete for " + _remoteEndPoint.ToString() + ".");
// }
// }
// else if (stunMessage.Header.MessageType == STUNv2MessageTypesEnum.BindingErrorResponse)
// {
// logger.Warn("A STUN binding error response was received from " + _remoteEndPoint + ".");
// }
// else
// {
// logger.Warn("An unrecognised STUN request was received from " + _remoteEndPoint + ".");
// }
// }
// catch (SocketException sockExcp)
// {
// logger.Debug("RTPChannel.RTPReceive STUN processing (" + _remoteEndPoint + "). " + sockExcp.Message);
// continue;
// }
// catch (Exception stunExcp)
// {
// logger.Warn("Exception RTPChannel.RTPReceive STUN processing (" + _remoteEndPoint + "). " + stunExcp);
// continue;
// }
//}
//else
//{
// logger.Warn("A STUN reponse was received on RTP socket from " + _remoteEndPoint + " but no ICE state was set.");
//}
#endregion
}
else
{
RTPPacket rtpPacket = new RTPPacket(buffer.Take(bytesRead).ToArray());
//System.Diagnostics.Debug.WriteLine("RTPReceive ssrc " + rtpPacket.Header.SyncSource + ", seq num " + rtpPacket.Header.SequenceNumber + ", timestamp " + rtpPacket.Header.Timestamp + ", marker " + rtpPacket.Header.MarkerBit + ".");
lock (_packets)
{
if (_packets.Count > RTP_PACKETS_MAX_QUEUE_LENGTH)
{
System.Diagnostics.Debug.WriteLine("RTPChannel.RTPReceive packets queue full, clearing.");
logger.Warn("RTPChannel.RTPReceive packets queue full, clearing.");
_packets.Clear();
OnRTPQueueFull?.Invoke();
}
else
{
_packets.Enqueue(rtpPacket);
}
}
}
}
}
else
{
logger.Warn("Zero bytes read from RTPChannel RTP socket connected to " + _remoteEndPoint + ".");
//break;
}
}
catch (SocketException sockExcp)
{
if (!_isClosed)
{
_rtpSocketError = sockExcp.SocketErrorCode;
if (_rtpSocketError == SocketError.Interrupted)
{
// If the receive has been interrupted it means the socket has been closed.
OnRTPSocketDisconnected?.Invoke();
break;
}
else
{
throw;
}
}
}
catch (Exception excp)
{
if (!_isClosed)
{
logger.Error("Exception RTPChannel.RTPReceive receiving. " + excp);
}
}
}
}
catch (Exception excp)
{
if (!_isClosed)
{
logger.Error("Exception RTPChannel.RTPReceive. " + excp);
OnRTPSocketDisconnected?.Invoke();
}
}
}