/// <summary> /// Does STUN transaction. Returns transaction response or null if transaction failed. /// </summary> /// <param name="request">STUN message.</param> /// <param name="socket">Socket to use for send/receive.</param> /// <param name="remoteEndPoint">Remote end point.</param> /// <param name="timeout">Timeout in milli seconds.</param> /// <returns>Returns transaction response or null if transaction failed.</returns> private static STUN_Message DoTransaction(STUN_Message request,Socket socket,IPEndPoint remoteEndPoint,int timeout) { byte[] requestBytes = request.ToByteData(); DateTime startTime = DateTime.Now; // Retransmit with 500 ms. while(startTime.AddMilliseconds(timeout) > DateTime.Now){ try{ socket.SendTo(requestBytes,remoteEndPoint); // We got response. if(socket.Poll(500 * 1000,SelectMode.SelectRead)){ byte[] receiveBuffer = new byte[512]; socket.Receive(receiveBuffer); // Parse message STUN_Message response = new STUN_Message(); response.Parse(receiveBuffer); // Check that transaction ID matches or not response what we want. if(Net_Utils.CompareArray(request.TransactionID,response.TransactionID)){ return response; } } } catch{ } } return null; }
/// <summary> /// Does STUN transaction. Returns transaction response or null if transaction failed. /// </summary> /// <param name="request">STUN message.</param> /// <param name="socket">Socket to use for send/receive.</param> /// <param name="remoteEndPoint">Remote end point.</param> /// <returns>Returns transaction response or null if transaction failed.</returns> private static STUN_Message DoTransaction(STUN_Message request,Socket socket,IPEndPoint remoteEndPoint) { byte[] requestBytes = request.ToByteData(); DateTime startTime = DateTime.Now; // We do it only 2 sec and retransmit with 100 ms. while(startTime.AddSeconds(2) > DateTime.Now){ try{ socket.SendTo(requestBytes,remoteEndPoint); // We got response. if(socket.Poll(100,SelectMode.SelectRead)){ byte[] receiveBuffer = new byte[512]; socket.Receive(receiveBuffer); // Parse message STUN_Message response = new STUN_Message(); response.Parse(receiveBuffer); // Check that transaction ID matches or not response what we want. if(request.TransactionID.Equals(response.TransactionID)){ return response; } } } catch{ } } return null; }