What is my Public/External IP

Ηθελε πριν λίγες μέρες ένας φίλος να φτιάξει ένα προγραμματάκι που να του δείχνει ποιά είναι η IP που έχει ο router του όταν συνδέεται στο Internet. Φυσικά η σύνδεση του είναι με δυναμική IP address και γενικά αυτή αλλάζει κάθε όποτε της καπνίσει. Οι βιβλιοθήκες και τα APIs των Windows (των λειτουργικών γενικότερα) μπορούν να σου δώσουν πληροφορίες για τον υπολογιστή τον ίδιο και όχι κάποια άλλη συσκευή ειδικά όταν αυτή μπορεί να συνδέεται στον υπολογιστή μέσα από κάποιο δίκτυο να υπάρχουν proxies, firewalls, και ότι άλλα καλούδια μπορεί να έχει στημένα κάποιος για να νομίζει πως είναι ασφαλής.

Την πληροφορία, ποιά IP διεύθυνση έχουμε όταν βγαίνουμε στο internet, δεν μπορούμε να την ξέρουμε εμείς που είμαστε πίσω από το μαύρο κουτί που λέγεται router. Θα πρέπει να μας την πεί άλλος. Ποιός είναι αυτός ο άλλος; Πιθανώς ο ISP που μας δίνει τη σύνδεση στο internet. Οσο και αν μας φαίνεται εύκολο, στην πράξη σιγά μην κάτσει να ασχοληθεί ο πάροχος να μας απαντάει (τον καθένα μας) αμέσως και κάθε φορά τι ip μας έχει δώσει.

Ισως κάποιοι να είναι τυχεροί, να έχουν πολύ καλή υποστήριξη, να έχουν καλά συμβόλαια, να είναι γνωστός τους ο ΧΥΖ υπάλληλος του ISP και να έχουν άμεσα όποια πληροφορία χρειάζονται, οποιαδήποτε στιγμή, αλλά δεν ισχύει για όλον τον κόσμο. Τον ISP λοιπόν τον ξεχνάμε σαν λύση και ψάχνουμε κάτι που να είναι:

  1. προσιτό σε όλον τον κόσμο
  2. εύκολο σαν λύση
  3. να μην απαιτεί πολλές γραφειοκρατικές διαδικασίες μέχρι να ξεκινήσει να λειτουργεί.

Η λύση που μπορεί να έχουμε, τελικά είναι ήδη μπροστά μας. Οι ιστοσελίδες! Για την ακρίβεια οι δυναμικές ιστοσελίδες.

Μια ιστοσελίδα είναι προσβάσιμη από όλους (οπότε καλύπτεται η 1η απαίτηση),
μπορεί να φτιαχτεί πολύ εύκολα, άσε που μπορεί να την έχει χρειαστεί άλλος πριν από εμάς και να είναι ήδη έτοιμη (αυτό και αν είναι εύκολη λύση),
για να την προσπελάσουμε και να δούμε τα περιεχόμενα της αρκεί να γνωρίζουμε τη διεύθυνση της, το url (Γραφειοκρατία μηδέν δηλαδή).

Αν φτιάξουμε εμείς ιστοσελίδα προφανώς και θα γνωρίζουμε το url της (θα είναι κάτι της μορφής http://server/page) οπότε έχουμε ξεπεράσει τη μία δυσκολία.

Ο κώδικας της ιστοσελίδας δεν είναι και πολύ δύσκολος, αρκεί να επιτρέφει την IP address εκείνου που την κάλεσε, τη δική μας δηλαδή εξωτερική ip που βγαίνει στο Internet!!!

Θα μπορούσαμε να φτιάξουμε μια php σελίδα με τον παρακάτω κώδικα:

<?php
    echo ($_SERVER['REMOTE_ADDR']);
?>

Πάει και η δεύτερη δυσκολία, αν μπορούμε να φτιάξουμε ιστοσελίδα. Επειδή όμως αρκετός κόσμος δεν μπορεί να φτιάξει ιστοσελίδα, ή δεν έχει όρεξη, ίσως είναι προτιμότερο να μην φτιάχνουμε ο καθένας τη δική του, ειδικά από τη στιγμή που υπάρχει ήδη έτοιμη στη διεύθυνση http://whatismyip.com/automation/n09230945.asp

Βέβαια η συγκεκριμένη διεύθυνση επιστρέφει συγκεκριμένες πληροφορίες με συγκεκριμένη μορφή, οπότε αν θέλουμε να έχουμε και κάτι ακόμα ή κάπως διαφορετικά, θα πρέπει αναγκαστικά να φτιάξουμε δική μας ιστοσελίδα. Για την συγκεκριμένη όμως ανάγκη που πάμε να καλύψουμε και αυτή η διεύθυνση είναι υπεραρκετή, επίσης είναι διαθέσιμη σε όλους, ο server που την φιλοξενεί έχει πολύ καλό uptime, και επιπλέον, αν χρειαστεί να την συντηρήσει κάποιος, αυτός δεν θα είμαστε εμείς! Εχουμε δηλαδή ότι πιο βολικό μπορούμε να βρούμε. Ο κώδικας που μας επιστρέφεται από τη σελίδα αυτή μπορούμε να δούμε ότι περιέχει σε απλό κείμενο μόνο την ip διεύθυνση χωρίς τίποτα επιπλέον!!!

ΧΧΧ.ΧΧΧ.ΧΧΧ.ΧΧΧ

Η ip ΧΧΧ.ΧΧΧ.ΧΧΧ.ΧΧΧ, είναι η δική μας ip διεύθυνση που ψάχνουμε.

Μένει λοιπόν να γράψουμε ένα προγραμματάκι που να κάνει αυτή τη δουλειά για μας, αντί να την κάνουμε εμείς χειροκίνητα κάθε φορά. Ευτυχώς στο msdn υπήρχαν κομμάτια κώδικα που με λίγο copy-paste και λίγο ράψιμο έκαναν τη δουλειά, με αποτέλεσμα τον παρακάτω C# κώδικα:

//Get the ip address from html source
public static string GetExternalIP()
{
    string tmp = GetHTMLSource("http://whatismyip.com/automation/n09230945.asp");
    if (string.IsNullOrEmpty(tmp))
        return "0.0.0.0";

    return tmp;
}

//Get the html source from page
public static string GetHTMLSource(string url)
{
    try
    {
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
        request.CachePolicy = new System.Net.Cache.RequestCachePolicy(
                                      System.Net.Cache.RequestCacheLevel.Reload);
        System.Net.HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream dataStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(dataStream);
        String responseText = reader.ReadToEnd();
        reader.Close();
        dataStream.Close();
        response.Close();
        return responseText;
    }
    catch (System.Net.WebException ex)
    {
        return string.Empty;
    }
}

Καλό θα είναι στις ρυθμίσεις του internet explorer να μην έχουμε βάλει κάποιον proxy, εκτός και αν δεν μας ενδιαφέρει η public ip η δική μας αλλά του proxy μας.

Αν θέλει κάποιος να κάνει build τον κώδικα, θα χρειαστεί το .net framework sdk, και την εντολή: csc /t:library DVA.Info.cs

Κατεβάστε τον κώδικα σε C# (sources και dll).

2 Comments

  1. Σκατά! Αν δεν κάνει κανείς αναζήτηση της προκοπής στο internet, αυτά συμβαίνουν. 🙁
    Λοιπόν, υπάρχει ακόμα καλύτερη πρόταση: Αντί της σελίδας http://checkip.dyndns.org/ είναι προτιμότερο να χρησιμοποιήσουμε την http://whatismyip.com/automation/n09230945.asp αφού επιστρέφει μόνο την ip διεύθυνση σαν κείμενο χωρίς τίποτα επιπλέον.

    Ετσι με τη νέα διεύθυνση μπορούμε να απλοποιήσουμε ακόμα περισσότερο τον κώδικα και να γίνει

    public static string GetExternalIP()
    {
        string tmp = GetHTMLSource(
         "http://whatismyip.com/automation/n09230945.asp");
        if (string.IsNullOrEmpty(tmp))
            return "0.0.0.0";
        return tmp;
    }

    STFI. Πρίν γίνει οτιδήποτε, STFI!
    Με βλέπω να βγάζω νέα έκδοση.

  2. Μετά από την προσπάθεια που είχα κάνει να διαβάσω το xml response ενός web serive της Δι@ύγειας, που κράσαρε το web service, λύθηκε το πρόβλημα προσθέτοντας τα

    request.Accept = "*/*";
    request.KeepAlive = true;

    Ο νέος κώδικας υπάρχει στο http://www.vasiliadis.eu/blog/2012/05/25/diavgeia-opendata-api-v2/