public STUNMessage SendRecvSTUN(IPEndPoint epStun, STUNMessage msgRequest, int nTimeout) { STUNRequestResponse req = new STUNRequestResponse(msgRequest); lock (StunLock) { StunRequestResponses.Add(req); } SendSTUNMessage(msgRequest, epStun); req.WaitForResponse(nTimeout); return(req.ResponseMessage); }
void RTPUDPClient_OnReceiveMessage(byte[] bData, int nLength, IPEndPoint epfrom, IPEndPoint epthis, DateTime dtReceived) { /// if we are an performing ICE, see if this is an ICE packet instead of an RTP one if (nLength >= 8) { //0x2112A442 if ((bData[4] == 0x21) && (bData[5] == 0x12) && (bData[6] == 0xA4) && (bData[7] == 0x42)) { /// STUN message STUN2Message smsg = new STUN2Message(); byte[] bStun = new byte[nLength]; Array.Copy(bData, 0, bStun, 0, nLength); smsg.Bytes = bStun; STUNRequestResponse foundreq = null; lock (StunLock) { foreach (STUNRequestResponse queuedreq in StunRequestResponses) { if (queuedreq.IsThisYourResponseSetIfItIs(smsg) == true) { foundreq = queuedreq; break; } } if (foundreq != null) { StunRequestResponses.Remove(foundreq); return; } } if (OnUnhandleSTUNMessage != null) { OnUnhandleSTUNMessage(smsg, epfrom); } return; } } /// TODO... handle RTCP packets if we ever care to }
public STUNMessage SendRecvSTUN1(EndPoint epStun, STUN2Message msgRequest, int nTimeout) { STUNRequestResponse req = new STUNRequestResponse(msgRequest); lock (StunLock) { StunRequestResponses.Add(req); } SendSTUNMessage(msgRequest, epStun); bool bResponse = req.WaitForResponse(nTimeout); lock (StunLock) { if (StunRequestResponses.Contains(req) == true) { StunRequestResponses.Remove(req); } } return(req.ResponseMessage); }
void RTPUDPClient_OnReceiveMessage(byte[] bData, int nLength, IPEndPoint epfrom, IPEndPoint epthis, DateTime dtReceived) { /// if we are an performing ICE, see if this is an ICE packet instead of an RTP one if (nLength >= 8) { //0x2112A442 if ((bData[4] == 0x21) && (bData[5] == 0x12) && (bData[6] == 0xA4) && (bData[7] == 0x42)) { /// STUN message STUNMessage smsg = new STUN2Message(); byte[] bStun = new byte[nLength]; Array.Copy(bData, 0, bStun, 0, nLength); try { smsg.Bytes = bStun; } catch (Exception ex) { smsg = new STUNMessage(); smsg.Bytes = bStun; } STUNRequestResponse foundreq = null; lock (StunLock) { foreach (STUNRequestResponse queuedreq in StunRequestResponses) { if (queuedreq.IsThisYourResponseSetIfItIs(smsg) == true) { foundreq = queuedreq; break; } } if (foundreq != null) { StunRequestResponses.Remove(foundreq); return; } } if (OnUnhandleSTUNMessage != null) { OnUnhandleSTUNMessage(smsg, epfrom); } return; } } RTPPacket packet = RTPPacket.BuildPacket(bData, 0, nLength); if (packet != null) /// Seems we get some TURN channel data messages from google talk { if (ReceiveSSRC == 0) { ReceiveSSRC = packet.SSRC; } if ((packet.PayloadType == this.Payload) && (packet.SSRC == this.ReceiveSSRC)) { IncomingRTPPacketBuffer.AddPacket(packet); } } }