Exemple #1
0
        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}");
        }
Exemple #2
0
        /// <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());
        }
Exemple #3
0
        /// <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);
        }
Exemple #4
0
        /// <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);
        }
Exemple #5
0
        /// <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);
        }
Exemple #6
0
 /// <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)));
 }
Exemple #7
0
 /// <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)));
 }
Exemple #8
0
 /// <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));
 }
Exemple #9
0
 /// <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));
 }