private static STUNQueryFullResult QueryInternal(Socket socket, IPEndPoint server, STUNQueryType queryType, NATTypeDetectionRFC natTypeDetectionRfc) { if (natTypeDetectionRfc == NATTypeDetectionRFC.Rfc3489) { return(STUNRfc3489.Query(socket, server, queryType, ReceiveTimeout)); } if (natTypeDetectionRfc == NATTypeDetectionRFC.Rfc5780) { return(STUNRfc5780.Query(socket, server, queryType, ReceiveTimeout)); } throw new Exception($"Unexpected RFC type {natTypeDetectionRfc}"); }
/// <param name="socket">A UDP <see cref="Socket"/> that will use for query. You can also use <see cref="UdpClient.Client"/></param> /// <param name="server">Server address</param> /// <param name="queryType">Query type</param> /// <param name="natTypeDetectionRfc">Rfc algorithm type</param> public static STUNQueryResult Query(Socket socket, IPEndPoint server, STUNQueryType queryType, IPAddress[] localIPs, NATTypeDetectionRFC natTypeDetectionRfc) { if (natTypeDetectionRfc == NATTypeDetectionRFC.Rfc3489) { return(STUNRfc3489.Query(socket, server, queryType, localIPs, ReceiveTimeout)); } if (natTypeDetectionRfc == NATTypeDetectionRFC.Rfc5780) { return(STUNRfc5780.Query(socket, server, queryType, localIPs, ReceiveTimeout)); } return(new STUNQueryResult()); }
/// <param name="server">Server address</param> /// <param name="queryType">Query type</param> /// <param name="closeSocket"> /// Set to true if created socket should closed after the query /// else <see cref="STUNQueryResult.Socket"/> will leave open and can be used. /// </param> public static STUNQueryResult Query(IPEndPoint server, STUNQueryType queryType, bool closeSocket, NATTypeDetectionRFC natTypeDetectionRfc = NATTypeDetectionRFC.Rfc3489) { var result = QueryInternal(server, queryType, closeSocket, natTypeDetectionRfc); if (result.QueryError != STUNQueryError.None) { throw new STUNQueryErrorException(result.QueryError); } if (result.ServerError != STUNErrorCodes.None) { throw new STUNServerErrorException(result.ServerError, result.ServerErrorPhrase); } return(result); }
/// <param name="server">Server address</param> /// <param name="queryType">Query type</param> /// <param name="closeSocket"> /// Set to true if created socket should closed after the query /// else <see cref="STUNQueryResult.Socket"/> will leave open and can be used. /// </param> public static STUNQueryResult Query(IPEndPoint server, STUNQueryType queryType, bool closeSocket, NATTypeDetectionRFC natTypeDetectionRfc = NATTypeDetectionRFC.Rfc3489) { Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint bindEndPoint = new IPEndPoint(IPAddress.Any, 0); socket.Bind(bindEndPoint); var result = Query(socket, server, queryType, natTypeDetectionRfc); if (closeSocket) { socket.Dispose(); result.Socket = null; } return(result); }
/// <param name="server">Server address</param> /// <param name="queryType">Query type</param> /// <param name="closeSocket"> /// Set to true if created socket should closed after the query /// else <see cref="STUNQueryResult.Socket"/> will leave open and can be used. /// </param> public static STUNQueryResult Query(IPEndPoint server, STUNQueryType queryType, bool closeSocket, NATTypeDetectionRFC natTypeDetectionRfc = NATTypeDetectionRFC.Rfc3489) { Task <IPAddress[]> localIPs = Dns.GetHostAddressesAsync(Dns.GetHostName()); localIPs.Wait(); Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint bindEndPoint = new IPEndPoint(IPAddress.Any, 0); socket.Bind(bindEndPoint); var result = Query(socket, server, queryType, localIPs.Result, natTypeDetectionRfc); if (closeSocket) { socket.Dispose(); result.Socket = null; } return(result); }
/// <param name="socket">A UDP <see cref="Socket"/> that will use for query. You can also use <see cref="UdpClient.Client"/></param> /// <param name="server">Server address</param> /// <param name="queryType">Query type</param> public static Task <STUNQueryResult> QueryAsync(Socket socket, IPEndPoint server, STUNQueryType queryType, IPAddress[] localIPs, NATTypeDetectionRFC natTypeDetectionRfc) { return(Task.Run(() => Query(socket, server, queryType, localIPs, natTypeDetectionRfc))); }
/// <param name="socket">A UDP <see cref="Socket"/> that will use for query. You can also use <see cref="UdpClient.Client"/></param> /// <param name="server">Server address</param> /// <param name="queryType">Query type</param> public static Task <STUNQueryFullResult> TryQueryAsync(Socket socket, IPEndPoint server, STUNQueryType queryType, NATTypeDetectionRFC natTypeDetectionRfc) { return(Task.Run(() => QueryInternal(socket, server, queryType, natTypeDetectionRfc))); }
/// <param name="socket">A UDP <see cref="Socket"/> that will use for query. You can also use <see cref="UdpClient.Client"/></param> /// <param name="server">Server address</param> /// <param name="queryType">Query type</param> /// <param name="natTypeDetectionRfc">Rfc algorithm type</param> public static STUNQueryFullResult TryQuery(Socket socket, IPEndPoint server, STUNQueryType queryType, NATTypeDetectionRFC natTypeDetectionRfc) { return(QueryInternal(socket, server, queryType, natTypeDetectionRfc)); }
/// <param name="server">Server address</param> /// <param name="queryType">Query type</param> /// <param name="closeSocket"> /// Set to true if created socket should closed after the query /// else <see cref="STUNQueryResult.Socket"/> will leave open and can be used. /// </param> public static STUNQueryFullResult TryQuery(IPEndPoint server, STUNQueryType queryType, bool closeSocket, NATTypeDetectionRFC natTypeDetectionRfc = NATTypeDetectionRFC.Rfc3489) { return(QueryInternal(server, queryType, closeSocket, natTypeDetectionRfc)); }