/// <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); }
/// <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; }