मशीन का आईपी पता प्राप्त करें


94

यह प्रश्न लगभग वैसा ही है जैसा कि पहले पूछे गए स्थानीय कंप्यूटर का आईपी पता प्राप्त करें- प्रश्न । हालाँकि मुझे Linux मशीन का IP पता (तों) खोजने की आवश्यकता है ।

तो: मैं कैसे - C ++ में प्रोग्रामेटिक रूप से - लिनक्स एप्लिकेशन के आईपी पते का पता लगा सकता हूं जो मेरा एप्लिकेशन चल रहा है। सर्वर में कम से कम दो आईपी पते होंगे और मुझे एक विशिष्ट एक (किसी दिए गए नेटवर्क में एक (सार्वजनिक एक) की आवश्यकता है)।

मुझे यकीन है कि ऐसा करने के लिए एक सरल कार्य है - लेकिन कहां?


चीजों को थोड़ा स्पष्ट करने के लिए:

  • सर्वर में स्पष्ट रूप से "लोकलहोस्ट" होगा: 127.0.0.1
  • सर्वर में एक आंतरिक (प्रबंधन) आईपी पता होगा: 172.16.xx
  • सर्वर में एक बाहरी (सार्वजनिक) आईपी पता होगा: 80.190.xx

मुझे अपने एप्लिकेशन को उसमें बाँधने के लिए बाहरी IP पता खोजने की आवश्यकता है। जाहिर है मैं INADDR_ANY से भी बंध सकता हूं (और वास्तव में इस समय मैं यही करता हूं)। मैं हालांकि सार्वजनिक पते का पता लगाना पसंद करूंगा।


3
Ifconfig के पॉपेन को क्यों चिह्नित करें? यह वास्तव में सही काम है। पुस्तकालय बदलते रहते हैं, लेकिन इफ़्फ़्फ़िग और पोपेन हमेशा बने रहेंगे।
एरिक एरोनिटी

3
नहीं है, ifconfig, routeआदि के लिए हटा दिया जाता है ipआदेश। अब आपको इसके बजाय इसका उपयोग करना चाहिए।
एंडर्स

ifconfig अभी भी, किसी भी अन्य दृष्टिकोण की तुलना में अधिक आर्किटेक्चर पर काम करता है। इसलिए इसे ip कमांड में बदलें। जब भी उचित हो पोपन अभी भी बेहतर उपाय है।
एरिक एरनैस्टी

जवाबों:


104

मुझे OS X पर ioctl सॉल्यूशन प्रॉब्लम मिला (जो कि POSIX कंप्लेंट है, लिनेक्स के लिए समान होना चाहिए)। हालाँकि, getifaddress () आपको वही काम आसानी से करने देगा, यह मेरे लिए os x 10.5 पर ठीक काम करता है और नीचे भी ऐसा ही होना चाहिए।

मैंने नीचे एक त्वरित उदाहरण दिया है जो मशीन के सभी IPv4 पते को प्रिंट करेगा, (आपको यह भी जांचना चाहिए कि गेटिफ़ैडर्स सफल रहा था यानी रिटर्न 0)।

मैंने इसे IPv6 पते भी दिखाया है।

#include <stdio.h>      
#include <sys/types.h>
#include <ifaddrs.h>
#include <netinet/in.h> 
#include <string.h> 
#include <arpa/inet.h>

int main (int argc, const char * argv[]) {
    struct ifaddrs * ifAddrStruct=NULL;
    struct ifaddrs * ifa=NULL;
    void * tmpAddrPtr=NULL;

    getifaddrs(&ifAddrStruct);

    for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) {
        if (!ifa->ifa_addr) {
            continue;
        }
        if (ifa->ifa_addr->sa_family == AF_INET) { // check it is IP4
            // is a valid IP4 Address
            tmpAddrPtr=&((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;
            char addressBuffer[INET_ADDRSTRLEN];
            inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
            printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer); 
        } else if (ifa->ifa_addr->sa_family == AF_INET6) { // check it is IP6
            // is a valid IP6 Address
            tmpAddrPtr=&((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;
            char addressBuffer[INET6_ADDRSTRLEN];
            inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
            printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer); 
        } 
    }
    if (ifAddrStruct!=NULL) freeifaddrs(ifAddrStruct);
    return 0;
}

7
+1 और उन उबाऊ ioctl के बजाय इस अच्छे दृष्टिकोण को लाने के लिए धन्यवाद! हालाँकि, IP6 की आपकी हैंडलिंग अभी भी गलत है - आपको sockaddr_in6 पर भेजना चाहिए, जैसे किtmpAddrPtr=&((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;
एंड्री

2
@ ऑन्ड्रे, धन्यवाद। मैंने अपने उत्तर को अपडेट कर लिया है (हालांकि इसका परीक्षण करने का मौका नहीं मिला है)
बारह

2
देता है loऔर wlan0मेरे मामले में इंटरफेस। मुझे क्या चाहिए wlan0या eth0जिसके पास इंटरनेट कनेक्शन है। क्या मुझे strcmpबेहतर तरीके से उपयोग करना चाहिए ?
सुदीप भट्टराई

28
  1. एक सॉकेट बनाएं।
  2. प्रदर्शन ioctl(<socketfd>, SIOCGIFCONF, (struct ifconf)&buffer);

और संरचनाओं के /usr/include/linux/if.hबारे में जानकारी के लिए पढ़ें । यह आपको सिस्टम पर प्रत्येक इंटरफ़ेस का आईपी पता देना चाहिए। अतिरिक्त ioctls के लिए भी पढ़ें ।ifconfifreq/usr/include/linux/sockios.h


मैं इस धारणा के तहत था कि यह आपको केवल उस इंटरफ़ेस का पता देगा जो इसे बांधता है।
मैट जॉइनर

@MattJoiner नहीं, मैन पेज पर एक नज़र डालें, SIOCGIFCONF रिटर्न सभी इंटरफेस पर जानकारी देता है। यहां उद्धृत मैन पेज का एक हिस्सा: "इंटरफ़ेस (ट्रांसपोर्ट लेयर) पतों की एक सूची लौटाएं। वर्तमान में इसका मतलब केवल अनुकूलता के लिए AF_INET (IPv4) परिवार के पते हैं। उपयोगकर्ता ioctl के तर्क के रूप में एक ifconf संरचना से गुजरता है। इसमें यह शामिल है। ifc_req में ifreq संरचनाओं की एक सरणी के लिए सूचक और ifc_len में बाइट्स में इसकी लंबाई। कर्नेल ifreq को सभी वर्तमान L3 इंटरफ़ेस पतों के साथ भरता है जो चल रहे हैं "
स्टीफन

25

मुझे jjvainio का जवाब पसंद है । जैसा कि Zan Lnyx कहता है, यह ईथरनेट इंटरफ़ेस के आईपी पते को खोजने के लिए स्थानीय रूटिंग टेबल का उपयोग करता है जो किसी विशिष्ट बाहरी होस्ट के कनेक्शन के लिए उपयोग किया जाएगा। एक जुड़े हुए यूडीपी सॉकेट का उपयोग करके, आप वास्तव में बिना किसी पैकेट को भेजे जानकारी प्राप्त कर सकते हैं। दृष्टिकोण की आवश्यकता है कि आप एक विशिष्ट बाहरी होस्ट चुनते हैं। ज्यादातर समय, किसी भी प्रसिद्ध सार्वजनिक आईपी को चाल करना चाहिए। मुझे इस उद्देश्य के लिए Google का सार्वजनिक DNS सर्वर पता 8.8.8.8 पसंद है, लेकिन ऐसा समय हो सकता है कि आप एक अलग बाहरी होस्ट IP चुनना चाहें। यहाँ कुछ कोड है जो पूर्ण दृष्टिकोण को दिखाता है।

void GetPrimaryIp(char* buffer, size_t buflen) 
{
    assert(buflen >= 16);

    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    assert(sock != -1);

    const char* kGoogleDnsIp = "8.8.8.8";
    uint16_t kDnsPort = 53;
    struct sockaddr_in serv;
    memset(&serv, 0, sizeof(serv));
    serv.sin_family = AF_INET;
    serv.sin_addr.s_addr = inet_addr(kGoogleDnsIp);
    serv.sin_port = htons(kDnsPort);

    int err = connect(sock, (const sockaddr*) &serv, sizeof(serv));
    assert(err != -1);

    sockaddr_in name;
    socklen_t namelen = sizeof(name);
    err = getsockname(sock, (sockaddr*) &name, &namelen);
    assert(err != -1);

    const char* p = inet_ntop(AF_INET, &name.sin_addr, buffer, buflen);
    assert(p);

    close(sock);
}

2
यह मुझे आईपी 127 का निजीकरण देता है। *। *। *। शायद इसलिए कि मैं NAT के पीछे हूँ?
यूजीन

14

जैसा कि आपको पता चला है कि एक एकल "स्थानीय आईपी पता" जैसी कोई चीज नहीं है। यहां बताया गया है कि स्थानीय पते का पता कैसे लगाया जा सकता है जिसे किसी विशिष्ट होस्ट को भेजा जा सकता है।

  1. एक यूडीपी सॉकेट बनाएं
  2. सॉकेट को एक बाहरी पते से कनेक्ट करें (मेजबान जो अंततः स्थानीय पता प्राप्त करेगा)
  3. स्थानीय पता प्राप्त करने के लिए getsockname का उपयोग करें

मैंने इसे कभी इस तरह से नहीं किया है लेकिन मुझे यह पसंद है। यह स्वचालित रूप से OS रूटिंग तालिका का उपयोग करता है और इंटरफ़ेस सूची को स्कैन करने की तुलना में बहुत आसान है।
ज़ैन लिंक्स

5
यह मानता है कि आप जानते हैं कि बाहर का पता क्या होगा। डेटा सेंटरों में अक्सर ऐसा नहीं होता है।
क्रिस्टोफर

आप हमेशा तीन कोशिश कर सकते हैं जो अलग-अलग महाद्वीपों को सौंपे जाते हैं (IANA इसे आसान बनाता है) और तीन में से सर्वश्रेष्ठ दो को स्वीकार करते हैं।
जोशुआ

9

यह यूनिक्स के कई स्वादों पर काम करने का लाभ है ... और आप इसे किसी भी ओ / एस पर काम करने के लिए तुच्छ रूप से संशोधित कर सकते हैं। उपरोक्त सभी उपाय मुझे संकलक त्रुटियों को देते हैं जो चंद्रमा के चरण पर निर्भर करते हैं। जिस क्षण ऐसा करने के लिए एक अच्छा पोसिक्स तरीका है ... इस का उपयोग न करें (जिस समय यह लिखा गया था, वह मामला नहीं था)।

// ifconfig | perl -ne 'print "$1\n" if /inet addr:([\d.]+)/'

#include <stdlib.h>

int main() {
        setenv("LANG","C",1);
        FILE * fp = popen("ifconfig", "r");
        if (fp) {
                char *p=NULL, *e; size_t n;
                while ((getline(&p, &n, fp) > 0) && p) {
                   if (p = strstr(p, "inet ")) {
                        p+=5;
                        if (p = strchr(p, ':')) {
                            ++p;
                            if (e = strchr(p, ' ')) {
                                 *e='\0';
                                 printf("%s\n", p);
                            }
                        }
                   }
              }
        }
        pclose(fp);
        return 0;
}

इस समाधान के लिए धन्यवाद, मेरे लिए बहुत अच्छा काम करता है और कई स्थितियों में बहुत काम आता है, जब आप सिर्फ cl-Programs से कुछ डेटा प्राप्त करना चाहते हैं
zitroneneis

हालांकि ifconfig आवश्यक डेटा का उत्पादन करता है, तो मैं इस तरह से किसी भी प्रोग्राम का उपयोग करके दृढ़ता से हतोत्साहित करूंगा। यह वास्तव में ifconfig के स्रोत में लाने और इसे चलाने और इसकी आउटपुट पार्स करने की तुलना में कार्यक्षमता प्राप्त करने के लिए बेहतर है।
जोर नसीबोव

1
@MartinMeeser: इसे "inet" और फिर ":" के लिए अलग से खोज कर, भाषा को तटस्थ बना दिया।
एरिक एरोनेस्टी

1
फिर आपके पास अन्य भाषाएँ हैं जो लैटिन आधारित वर्ण सेट भी नहीं है। सॉलेन्स कमांड टूल्स का उपयोग नहीं करना है, क्योंकि वे जैसे पदावनत हो जाते हैं ifconfig। आपको ipअभी उपयोग करना चाहिए । उचित भाषा तटस्थ उत्पादन उत्पन्न की जिस तरह से सेट करने के लिए है LANGकरने के लिए वातावरण चर C, जैसे:LANG=C ls -l
ऐन्डर्स

1
धन्यवाद। यह एक आसान और भयानक समाधान है!
अहमद अफकंडेह

5

मुझे नहीं लगता कि आपके प्रश्न का कोई निश्चित सही उत्तर है। इसके बजाय तरीकों का एक बड़ा बंडल है कि आप जो चाहते हैं उसके करीब कैसे पहुंचें। इसलिए मैं कुछ संकेत प्रदान करूंगा कि इसे कैसे पूरा किया जाए।

यदि किसी मशीन में 2 से अधिक इंटरफेस हैं ( loएक के रूप में गिना जाता है) तो आपको सही इंटरफ़ेस को आसानी से ऑटोडेक्ट करने में समस्या होगी। यहाँ कुछ व्यंजनों पर यह कैसे करना है।

उदाहरण के लिए, समस्या यह है कि यदि होस्ट NAT फ़ायरवॉल के पीछे DMZ में हैं जो सार्वजनिक IP को कुछ निजी IP में बदल देता है और अनुरोधों को आगे बढ़ाता है। आपकी मशीन में 10 इंटरफेस हो सकते हैं, लेकिन केवल एक ही जनता से मेल खाता है।

यहां तक ​​कि ऑटोडेटेक्शन उस स्थिति में काम नहीं करता है जब आप डबल-एनएटी पर होते हैं, जहां आपका फ़ायरवॉल स्रोत-आईपी को पूरी तरह से अलग चीज़ में बदल देता है। तो आप यह भी सुनिश्चित नहीं कर सकते हैं, कि डिफ़ॉल्ट मार्ग सार्वजनिक इंटरफ़ेस के साथ आपके इंटरफ़ेस की ओर जाता है।

डिफ़ॉल्ट मार्ग के माध्यम से इसका पता लगाएं

यह चीजों को स्वतःप्रेरित करने का मेरा अनुशंसित तरीका है

ऐसा कुछ ip r get 1.1.1.1आमतौर पर आपको इंटरफ़ेस बताता है जिसमें डिफ़ॉल्ट मार्ग है।

यदि आप अपनी पसंदीदा स्क्रिप्टिंग / प्रोग्रामिंग भाषा में इसे फिर से बनाना चाहते हैं, strace ip r get 1.1.1.1तो पीले ईंट रोड का उपयोग करें और उसका पालन करें।

इसके साथ सेट करें /etc/hosts

यदि आप नियंत्रण में रहना चाहते हैं तो यह मेरी सिफारिश है

आप /etc/hostsजैसे में एक प्रविष्टि बना सकते हैं

80.190.1.3 publicinterfaceip

फिर आप publicinterfaceipअपने सार्वजनिक इंटरफ़ेस को संदर्भित करने के लिए इस उपनाम का उपयोग कर सकते हैं ।

अफसोस की बात haproxyहै कि इस चाल को IPv6 के साथ नहीं किया गया

पर्यावरण का उपयोग करें

/etc/hostsयदि आप नहीं हैं तो यह एक अच्छा समाधान हैroot

के रूप में ही /etc/hosts। लेकिन इसके लिए पर्यावरण का उपयोग करें। आप इसके लिए प्रयास कर सकते हैं /etc/profileया कर सकते हैं ~/.profile

इसलिए यदि आपके कार्यक्रम को एक चर की जरूरत है MYPUBLICIPतो आप कोड को शामिल कर सकते हैं (यह सी है, इसे सी + + बनाने के लिए स्वतंत्र महसूस करें):

#define MYPUBLICIPENVVAR "MYPUBLICIP"

const char *mypublicip = getenv(MYPUBLICIPENVVAR);

if (!mypublicip) { fprintf(stderr, "please set environment variable %s\n", MYPUBLICIPENVVAR); exit(3); }

तो आप /path/to/your/scriptइस तरह से अपनी स्क्रिप्ट / प्रोग्राम को कॉल कर सकते हैं

MYPUBLICIP=80.190.1.3 /path/to/your/script

यह भी काम करता है crontab

सभी इंटरफेस की गणना करें और जिन्हें आप नहीं चाहते हैं उन्हें खत्म करें

यदि आप उपयोग नहीं कर सकते तो हताश रास्ता ip

यदि आप जानते हैं कि आप क्या नहीं चाहते हैं, तो आप सभी इंटरफेस की गणना कर सकते हैं और सभी झूठे लोगों को अनदेखा कर सकते हैं।

यहां पहले से ही इस दृष्टिकोण के लिए एक उत्तर https://stackoverflow.com/a/265978/490291 लगता है ।

इसे DLNA की तरह करें

शराबी का तरीका जो खुद को शराब में डुबोने की कोशिश करता है

आप अपने नेटवर्क पर सभी UPnP गेटवे की गणना करने का प्रयास कर सकते हैं और इस तरह से किसी "बाहरी" चीज के लिए एक उचित मार्ग का पता लगा सकते हैं। यह ऐसे मार्ग पर भी हो सकता है जहाँ आपका डिफ़ॉल्ट मार्ग इंगित नहीं करता है।

इस पर अधिक जानकारी के लिए शायद https://en.wikipedia.org/wiki/Internet_Gateway_Device_Protocol देखें

इससे आपको एक अच्छा आभास मिलता है कि आपका वास्तविक सार्वजनिक इंटरफ़ेस क्या है, भले ही आपका डिफ़ॉल्ट मार्ग कहीं और इंगित करता हो।

और भी हैं

जहां पहाड़ नबी से मिलता है

IPv6 राउटर आपको सही IPv6 उपसर्ग देने के लिए खुद का विज्ञापन करते हैं। उपसर्ग को देखने से आपको संकेत मिलता है कि क्या यह कुछ आंतरिक आईपी या एक वैश्विक है।

आप कुछ उपयुक्त गेटवे का पता लगाने के लिए IGMP या IBGP फ्रेम के लिए सुन सकते हैं।

कम से कम 2 ^ 32 आईपी पते हैं। इसलिए इन सभी को पिंग करने के लिए एक LAN पर देर नहीं लगती है। यह आपको एक सांख्यिकीय संकेत देता है, जहां इंटरनेट का अधिकांश हिस्सा आपके दृष्टिकोण से स्थित है। हालाँकि आपको प्रसिद्ध https://de.wikipedia.org/wiki/SQL_Slammer की तुलना में थोड़ा अधिक समझदार होना चाहिए

ICMP और यहां तक ​​कि ARP नेटवर्क साइडबैंड जानकारी के लिए अच्छे स्रोत हैं। यह आपकी मदद कर सकता है।

आप अपने सभी नेटवर्क इंफ्रास्ट्रक्चर उपकरणों से संपर्क करने के लिए ईथरनेट ब्रॉडकास्ट एड्रेस का उपयोग कर सकते हैं जो अक्सर डीएचसीपी (यहां तक ​​कि डीएचसीपीवी 6) और इसी तरह से मदद करेगा।

यह अतिरिक्त सूची संभवतः अंतहीन और हमेशा अपूर्ण है, क्योंकि नेटवर्क उपकरणों का प्रत्येक निर्माता अपने स्वयं के उपकरणों को ऑटो-डिटेक्ट करने के तरीके पर नए सुरक्षा छेद का आविष्कार कर रहा है। जो अक्सर कुछ सार्वजनिक इंटरफ़ेस का पता लगाने में बहुत मदद करता है जहां कोई एक नहीं होता है।

'निफ ने कहा। बाहर।


4

स्टीव बेकर ने जो कहा है, उसके आगे, आप नेटदेव (7) मैन पेज में SIOCGIFCONF ioctl का विवरण पा सकते हैं ।

एक बार जब आपके पास होस्ट पर सभी आईपी पतों की सूची होगी, तो आपको उन पतों को फ़िल्टर करने के लिए एप्लिकेशन विशिष्ट तर्क का उपयोग करना होगा जो आप नहीं चाहते हैं और आशा है कि आपके पास एक आईपी पता बाकी है।


4

इसे हार्ड कोड न करें: यह उस तरह की चीज़ है जो बदल सकती है। कई प्रोग्राम यह पता लगाते हैं कि एक कॉन्फिग फाइल में पढ़कर क्या बांधना है, और जो कुछ भी कहते हैं वह करना है। इस तरह, आपके कार्यक्रम को भविष्य में कुछ समय के लिए किसी ऐसी चीज से बांधने की जरूरत है जो सार्वजनिक आईपी नहीं है, ऐसा कर सकती है।


2

जैसा कि प्रश्न लिनक्स को निर्दिष्ट करता है, एक मशीन के आईपी-पते की खोज के लिए मेरी पसंदीदा तकनीक नेटलिंक का उपयोग करना है। प्रोटोकॉल NETLINK_ROUTE का एक नेटलिंक सॉकेट बनाकर, और RTM_GETADDR भेजने से, आपके एप्लिकेशन को एक संदेश प्राप्त होगा जिसमें सभी उपलब्ध IP पते होंगे। एक उदाहरण यहाँ दिया गया है

केवल संदेश हैंडलिंग के कुछ हिस्सों के लिए, libmnl सुविधाजनक है। यदि आप NETLINK_ROUTE के विभिन्न विकल्पों (और उन्हें पार्स कैसे किया जाता है) के विभिन्न विकल्पों के बारे में अधिक जानने की उत्सुकता रखते हैं, तो सबसे अच्छा स्रोत iproute2 (विशेषकर मॉनिटर एप्लिकेशन) के स्रोत कोड के साथ-साथ कर्नेल में प्राप्त फ़ंक्शन हैं। Rtnetlink के मैन पेज में उपयोगी जानकारी भी होती है।


1

आप कर्ल के साथ कुछ एकीकरण कर सकते हैं जैसा कि कुछ आसान है: curl www.whatismyip.orgशेल से आपको अपना वैश्विक आईपी मिलेगा। आप कुछ बाहरी सर्वर पर निर्भर हैं, लेकिन आप हमेशा एक NAT के पीछे रहेंगे।


मैं कभी नहीं समझता कि अधिक लोग इस साइट का उपयोग क्यों नहीं करते हैं। यहां तक ​​कि उनके पास एक मशीन पठनीय पृष्ठ है, इसलिए आपको जानकारी को स्क्रैप करने की आवश्यकता नहीं है।
deft_code

1
यदि आप प्रॉक्सी के अंदर काम कर रहे हैं तो आपको सही आईपी नहीं मिल सकता है।
जैक

1
icanhazip.com IP लौटाता है और इससे ज्यादा कुछ नहीं। एक बैश स्क्रिप्ट में एम्बेड करने के लिए बिल्कुल सही!
लुकासी

ipinfo.io/ip एक अन्य विकल्प है। यदि आप ipinfo.io को कर्ल करते हैं, तो यह JSON प्रारूप में होस्टनाम, जियोलोकेशन जानकारी और बहुत कुछ देता है।
बेन डॉवलिंग


-10

// Use a HTTP request to a well known server that echo's back the public IP address void GetPublicIP(CString & csIP) { // Initialize COM bool bInit = false; if (SUCCEEDED(CoInitialize(NULL))) { // COM was initialized bInit = true;

    // Create a HTTP request object
    MSXML2::IXMLHTTPRequestPtr HTTPRequest;
    HRESULT hr = HTTPRequest.CreateInstance("MSXML2.XMLHTTP");
    if (SUCCEEDED(hr))
    {
        // Build a request to a web site that returns the public IP address
        VARIANT Async;
        Async.vt = VT_BOOL;
        Async.boolVal = VARIANT_FALSE;
        CComBSTR ccbRequest = L"http://whatismyipaddress.com/";

        // Open the request
        if (SUCCEEDED(HTTPRequest->raw_open(L"GET",ccbRequest,Async)))
        {
            // Send the request
            if (SUCCEEDED(HTTPRequest->raw_send()))
            {
                // Get the response
                CString csRequest = HTTPRequest->GetresponseText();

                // Parse the IP address
                CString csMarker = "<!-- contact us before using a script to get your IP address -->";
                int iPos = csRequest.Find(csMarker);
                if (iPos == -1)
                    return;
                iPos += csMarker.GetLength();
                int iPos2 = csRequest.Find(csMarker,iPos);
                if (iPos2 == -1)
                    return;

                // Build the IP address
                int nCount = iPos2 - iPos;
                csIP = csRequest.Mid(iPos,nCount);
            }
        }
    }
}

// Unitialize COM
if (bInit)
    CoUninitialize();

}


10
यह एक भारी, केवल-विंडोज़ (लिनक्स के बारे में प्रश्न) है, वेबसाइट सामग्री के नाजुक पार्सिंग के माध्यम से स्थानीय नियंत्रण से बाहर सेवाओं पर निर्भर बुरी तरह से स्वरूपित समाधान। इस "समाधान" का कोई सकारात्मक पक्ष नहीं मिल सकता है।
विराटपुर

1
हा! HTML पार्सिंग एक टिप्पणी के लिए भी देखता है जो वास्तव में क्या किया जा रहा है के बारे में चेतावनी है।
23
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.