מה כתובת ה IP איתה אני יוצא מהמחשב שלי החוצה ?

הנה בעיה תכנותית ידועה: יש לי צורך לדעת מה כתובת ה IP שאיתה אני יוצא החוצה מהמחשב (לא בהכרח מהאינטרנט). חלק מהאנשים יתחילו כאן לנתח את ifconfig, חלק אחר ינסה לגלות דרך השם של המחשב, וחלק נוסף יצרו איזה דימון מסתורי שיתשאל ראוטר כלשהו (באמת נתקלתי במישהו שעשה את זה).

הנה דרך שהיא בנתיים הכי טובה שאני נתקלתי לבצע את המשימה הזו:

require 'socket'

def local_ip
  orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true  # turn off reverse DNS resolution temporarily

  UDPSocket.open do |s|
    s.connect '64.233.187.99', 1
    s.addr.last
  end
ensure
  Socket.do_not_reverse_lookup = orig
end

בזכות העובדה ש UDP חסר מצב, כלומר הוא לא שולח מידע אלא אם "מכריחים" אותו, אנחנו גורמים לקוד שלנו לתשאל את המערכת מה הדרך שבא נצא החוצה (עבור השירות הזה לפחות), ואנחנו מחזירים את הכתובת שהיא במסלול היציאה שלנו מהמחשב.

הכתובת IP זו הכתובת של גוגל, אבל היא לא חשובה. אפשר לשים כל כתובת אחרת שאינה מוגדרת לנו מקומית על המחשב (כלומר כ localhost).

אני חייב לציין שזו הדרך המדוייקת ביותר שנתקלתי בה עד עכשיו.

4 מחשבות על “מה כתובת ה IP איתה אני יוצא מהמחשב שלי החוצה ?

  1. יורם

    לא רע, הנה גרסא (פשוטה, בלי כיסוי פינות) בפרל :
    use IO::Socket::INET;
    my $s = IO::Socket::INET->new (Proto => 'udp',PeerAddr => 'perl.org');
    printf ("Address is %s\n",inet_ntoa($s->sockaddr));

  2. אהוד

    נחמד. יש לי תוכנית קטנה (100 שורות) ב-C שעושה הרבה יותר ואפשר להפעילה בכל script –
    פרל, רובי, shell מכל סוג. היא גם לא דורשת לפתוח socket (מה קורה לשני ההליכים שלכם אם ההתקשרות לא הצליחה ?).

  3. ik_5 מאת

    אשמח לשמוע איך (השיטה יותר מהקוד) עשית את זה, ואני מחפש גם דרך יעילה לדעת מה הכתובת החיצונית שלי בלי לצאת החוצה…

    בכל מקרה, רובי, פרל ופיתון הן שפות תכנות כמו שפת C.

    בקוד שאני הצגתי כאן, אין יציאה החוצה ואם יש בעיה, יש exception שמורים לטפל בו.

  4. אהוד

    הנה התוכנית:

    /* ip-check - Display current IP
    */
    
    #include <stdio.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #ifdef __CYGWIN__
    #include <windows.h>                 /* for some specific Windoz calls */
    #endif /* __CYGWIN__ */
    
    /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
    
    int main ( int argc , char *argv [ ] )
    {
    struct  hostent *hent ;                        /* host entry */
    char svname [ 250 ] = "" ;                     /* empty host for start */
    int req = -1 ;                                 /* request -1=normal, 0-name, 1-n=ip[n] */
    int ix = 0 ;
    unsigned char *ad ;
    char *myname = svname ;
    int p = 1 ;
    
       while ( p < argc )
       {
           if ( argv [ p ] [ 0 ] == '-' )          /* parameter (not host name) */
               switch ( argv [ p ] [ 1 ] | ('a' ^ 'A') )   /* 2nd char (lower case) */
               {
                   case 'n':                       /* -n[ame] */
                           req = 0 ;
                           break ;                 /* OK */
    
                   case 'i':                       /* -i[p] */
                           req = 1 ;
                           break ;                 /* OK */
    
                   case '0':                       /* -0 = -name */
                   case '1':                       /* -1 = -ip */
                   case '2':                       /* -2 = ip 2 */
                   case '3':                       /* -3 = ip 3 */
                   case '4':                       /* -4 = ip 4 */
                   case '5':                       /* -5 = ip 5 */
                   case '6':                       /* -6 = ip 6 */
                   case '7':                       /* -7 = ip 7 */
                   case '8':                       /* -8 = ip 8 */
                   case '9':                       /* -9 = ip 9 */
                           req = argv [ p ] [ 1 ] - '0' ;
                           break ;                 /* OK */
    
                   default:
                           fprintf ( stderr , "Arg %d (%s) illegal, should be -n, -i -[2-9]\n" ,
                                     p , argv [ p ] ) ;
                           exit ( 3 ) ;
               }
           else
               myname = argv [ p ] ;               /* use this as host name */
    
           p++ ;                                   /* next arg */
       }
    
    
    
       if ( ( *myname == 0 ) &&                    /* empty host name */
            ( gethostname ( myname , 250 ) < 0 ) ) /* get hostname - must be successfull */
           {
               fprintf ( stderr , "Gethostname failed\n" ) ;
               exit ( 1 ) ;
           }
    
       if ( req  h_addr_list [ ix ] != NULL )
       {
           ad = hent -> h_addr_list [ ix ] ;
           if ( req == ix )
           {
               printf ( "%d.%d.%d.%d\n" , *ad , *(ad+1) , *(ad+2) , *(ad+3) ) ;
               exit ( 0 ) ;                        /* exit (OK) */
           }
    
           if ( req < 0 )                          /* output every address ? */
               fprintf ( stderr , "Address %d: %d.%d.%d.%d\n" ,
                         ix + 1 , *ad , *(ad+1) , *(ad+2) , *(ad+3) ) ;
           ix ++ ;                                 /* next ip address */
       }
    
       exit ( 0 ) ;
    }
    /*===========================================================================*/
    

    והנה דוגמאות להרצה:

    # host-ip
    Hostname to check is ekc-fs
    Address 1: 192.168.2.1
    
    # host-ip cnn.com
    Hostname to check is cnn.com
    Address 1: 157.166.226.26
    Address 2: 157.166.226.25
    Address 3: 157.166.224.26
    Address 4: 157.166.224.25
    Address 5: 157.166.255.19
    Address 6: 157.166.255.18
    
    # host-ip -1
    192.168.2.1
    
    # host-ip -0
    ekc-fs
    
    # host-ip -2 cnn.com
    157.166.224.25
    

להשאיר תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s