/// <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()); }
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="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) { Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint bindEndPoint = new IPEndPoint(IPAddress.Any, 0); socket.Bind(bindEndPoint); var result = STUNRfc5780.Query(socket, server, queryType, ReceiveTimeout); if (closeSocket) { socket.Dispose(); result.Socket = null; } return(result); }