How to check whether a port is open at client's network/firewall?

前端 未结 8 1416
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-11-30 13:13

This is solved at last with \"timeout\" attribute of jQuery AJAX (and JSONP). See my own answer !

Please see the updated part, I

相关标签:
8条回答
  • 2020-11-30 13:24

    Gotcha !!! I have solved my problem with JSONP and jQuery AJAX call. I discovered the timeout attribute of jQuery AJAX and my code executed fluently when the port was blocked or opened. Here is the solution for future visitors. Thanks to all answerers for contribution.

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
            <script type="text/javascript" src="jquery-1.7.2-min.js"></script>
        </head>
        <body>
            <script type"text/javascript">
                var isAccessible = null;
                function checkConnection() {
                    var url = "http://101.212.33.60:1935/test/hello.html" ;
                    $.ajax({
                        url: url,
                        type: "get",
                        cache: false,
                        dataType: 'jsonp', // it is for supporting crossdomain
                        crossDomain : true,
                        asynchronous : false,
                        jsonpCallback: 'deadCode',
                        timeout : 1500, // set a timeout in milliseconds
                        complete : function(xhr, responseText, thrownError) {
                            if(xhr.status == "200") {
                               isAccessible = true;
                               success(); // yes response came, esecute success()
                            }
                            else {
                               isAccessible = false;
                               failure(); // this will be executed after the request gets timed out due to blockage of ports/connections/IPs
                            }
                        }
                   });
                }
                $(document).ready( function() {
                    checkConnection(); // here I invoke the checking function
                });
            </script>
        </body>
    </html>
    
    0 讨论(0)
  • 2020-11-30 13:30

    Instead of an applet a flash component may be used. Using the Socket class available in ActionCcript one can open a tcp connection from flash to a port on a server to check if its open. But based on the flash player version a policy file needs to be placed on the server to which the socket is opened.

    0 讨论(0)
  • 2020-11-30 13:33

    Here is a Java code as an Applet to test server/port connectivity:

    import java.io.*;
    import java.net.*;
    
    public class ConnectionTestApplet extends Applet {
        public void start() {
            boolean portAvailable = false;
            int delay = 1000; // 1 s
            try {
                Socket socket = new Socket();
                socket.connect(new InetSocketAddress("server.domain.com", 1935), delay);
                portAvailable = socket.isConnected();
                socket.close();
            } catch (UnknownHostException uhe) {
                uhe.printStackTrace();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
            System.out.println("Connection possible: " + portAvailable);
        }
    }
    

    You still have to get the information out of the applet to do something else with that result. The easiest way is to redirect the browser thanks to getAppletContext().showDocument(url)

    0 讨论(0)
  • 2020-11-30 13:36

    You cannot do this in JavaScript because it doesn't have true socket support, with JavaScript you can only test for the presence of HTTP socket. You could use Java (JavaScript is not Java) and write a proper Java Applet to do it.

    You should also read this Q&A How to Ping in java

    Try using isReachable

    0 讨论(0)
  • 2020-11-30 13:38

    Check this out:

    http://blog.andlabs.org/2010/12/port-scanning-with-html5-and-js-recon.html

    With JS-Recon, you can do port scanning with javascript. You can simply point it to your local IP address. I believe it works by making a web sockets/cors connection to an arbitrary desintation ip/socket and measuring the timeouts. It is not a perfect approach, but this may be the limit of javascript ultimately.

    If you can do it in a java applet/flash application, that may be better ultimately as they have lower-level access.

    0 讨论(0)
  • 2020-11-30 13:38

    In JavaScript, you have to work-around the asynchronous issue. Here is a proposal:

    • The HTML page displays an animated image as a progress bar
    • You invoke the checkURL
    • After either receiving the callback or a defined timeout, you change display for an error message or do on with the job to do

    Based on the following document with the use of XMLHttpRequest, here is a code example for checkURL:

    var myrequest = new ajaxRequest();
    var isAccessible = false;
    myrequest._timeout = setTimeout(function() {
          myrequest.abort();
          displayErrorMessage();
        },
        1000
        ) //end setTimeout
    myrequest.onreadystatechange = function() {
        if (myrequest.readyState == 4) { //if request has completed
          if (myrequest.status == 200) {
            isAccessible = false;
            goOnWithTheJob();
          } else {
            displayErrorMessage();
          }
        }
    myrequest.open("GET", url, true);
    myrequest.send(null); //send GET request
    // do nothing - wait for either timeout or readystate callback 
    

    This code lets 1 second to get the 200 response from a HTTP GET on a basic resource.

    In your local test, you get an immediate answer because the system answers connection reset if the port is closed but a firewall just does not answer.

    Even if the open method may be used synchronously, I recommend the use of a timer because the code is likely to wait for TCP timeouts and retries (3 x 1 minute ?) as a firewall usually just drops packets on closed ports and may reject ICMP packets, preventing you to test availability thanks to ping. And I imagine such a long wait is not expected for such a check.

    0 讨论(0)
提交回复
热议问题