মেশিনের আইপি ঠিকানা পান


94

এই প্রশ্নটি প্রায় আগের অনুরূপ স্থানীয় কম্পিউটারের আইপি অ্যাড্রেস পান - প্রশ্ন । তবে আমাকে একটি লিনাক্স মেশিনের আইপি অ্যাড্রেস (এস) সন্ধান করতে হবে ।

সুতরাং: আমি কীভাবে প্রোগ্রামটিতে সি ++ এ থাকি - আমার অ্যাপ্লিকেশনটি চালু আছে এমন লিনাক্স সার্ভারের আইপি ঠিকানাগুলি সনাক্ত করুন। সার্ভারগুলির কমপক্ষে দুটি আইপি ঠিকানা থাকবে এবং আমার একটি নির্দিষ্ট একটি (প্রদত্ত নেটওয়ার্কের একটি (জনসাধারণের)) প্রয়োজন।

আমি নিশ্চিত যে এটি করার জন্য একটি সাধারণ ফাংশন আছে - তবে কোথায়?


কিছুটা পরিষ্কার করার জন্য:

  • সার্ভারে অবশ্যই "লোকালহোস্ট" থাকবে: 127.0.0.1
  • সার্ভারটির অভ্যন্তরীণ (পরিচালনা) IP ঠিকানা থাকবে: 172.16.xx xx
  • সার্ভারটির একটি বহিরাগত (সার্বজনীন) IP ঠিকানা থাকবে: 80.190.xx

আমার অ্যাপ্লিকেশনটিকে এটিতে আবদ্ধ করতে আমাকে বাহ্যিক আইপি ঠিকানাটি সন্ধান করতে হবে। স্পষ্টতই আমি INADDR_ANY এর সাথেও আবদ্ধ থাকতে পারি (এবং আসলে এই মুহূর্তে আমি যা করি)। যদিও আমি জনসাধারণের ঠিকানা সনাক্ত করতে পছন্দ করব।


4
কেন ইফকনফিগের পপেন চিহ্নিত করবেন? এটি আসলেই সঠিক জিনিস। গ্রন্থাগারগুলি পরিবর্তন হয় তবে আইফনফিগ এবং পপেন সর্বদা থাকবে।
এরিক অ্যারোনস্টি

4
না, ifconfig, routeইত্যাদি জন্য অসমর্থিত হয় ipকমান্ড। পরিবর্তে এখন আপনার এটি ব্যবহার করা উচিত।
Anders

ifconfig এখনও, আজ, অন্য যে কোনও পদ্ধতির চেয়ে বেশি আর্কিটেকচারে কাজ করে। সুতরাং এটি আইপি কমান্ডে পরিবর্তন করুন। যখন / উপযুক্ত হয়। popen এখনও ভাল সমাধান।
এরিক অ্যারোনস্টি

উত্তর:


104

আমি ওএস এক্স-তে আইওসিটিএল সমাধানটি সমস্যাযুক্ত পেয়েছি (এটি পসিক্সের সাথে সামঞ্জস্যপূর্ণ তাই লিনাক্সের সাথে সমান হওয়া উচিত)। তবে জেটিফ্যাড্রেস () আপনাকে একই জিনিসটি সহজেই করতে দেয়, এটি আমার পক্ষে OS x 10.5 এ ঠিকঠাক কাজ করে এবং নীচে একই হওয়া উচিত।

আমি নীচে একটি দ্রুত উদাহরণ দিয়েছি যা মেশিনের সমস্ত আইপিভি 4 ঠিকানা মুদ্রণ করবে, (আপনারও পরীক্ষা করা উচিত জিফ্যাড্ডার্স সফল হয়েছে অর্থাৎ 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 এবং বোরিং আইওসিটিএলের পরিবর্তে এই দুর্দান্ত পদ্ধতির আনার জন্য ধন্যবাদ! যাইহোক, IP6 আপনার হ্যান্ডলিং এখনো ভুল হয় - আপনি sockaddr_in6 করার মত অর্থাত কিছু নিক্ষেপ করা উচিতtmpAddrPtr=&((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;
আন্দ্রে

4
@ আন্ড্রে, ধন্যবাদ আমি আমার উত্তর আপডেট করেছি (যদিও এটি পরীক্ষা করার সুযোগ হয়নি)
দ্বাদশ 47

4
আমার ক্ষেত্রে ইন্টারফেস দেয় loএবং দেয় wlan0। আমার যা যা প্রয়োজন তা wlan0বা eth0যার সাথে ইন্টারনেট সংযোগ রয়েছে strcmpo সুতরাং , আমার কি আরও ভাল কোনও উপায় ব্যবহার করা উচিত ?
সুদীপ ভট্টারাই

28
  1. একটি সকেট তৈরি করুন।
  2. পারফর্ম ioctl(<socketfd>, SIOCGIFCONF, (struct ifconf)&buffer);

কাঠামো এবং /usr/include/linux/if.hতথ্যের জন্য পড়ুন । এটি আপনাকে সিস্টেমে প্রতিটি ইন্টারফেসের আইপি ঠিকানা দেওয়া উচিত। অতিরিক্ত ioctls জন্য পড়ুন ।ifconfifreq/usr/include/linux/sockios.h


আমি ইমপ্রেশনের মধ্যে ছিলাম এটি আপনাকে কেবল ইন্টারফেসের সাথে আবদ্ধ করার ঠিকানা দেবে।
ম্যাট জয়েনার

@ ম্যাটজয়াইনার না, ম্যান পেজটি একবার দেখুন, এসআইওসিজিফিসনএফ সমস্ত ইন্টারফেসে তথ্য ফেরত দেয়। ম্যান পৃষ্ঠার অংশটি এখানে উদ্ধৃত হয়েছে: "ইন্টারফেসের (ট্রান্সপোর্ট লেয়ার) ঠিকানাগুলির একটি তালিকা ফেরত দিন This ifc_req এ ifreq স্ট্রাকচারের একটি অ্যারে এবং ifc_len এর দৈর্ঘ্য বাইটে নির্দেশক। কার্নেলটি চলমান সমস্ত বর্তমান L3 ইন্টারফেস ঠিকানা দিয়ে ifreqs পূরণ করে "
স্টাফেন

25

আমি jjvainio উত্তর পছন্দ । জ্যান লিনেক্স যেমন বলেছেন, এটি ইথারনেট ইন্টারফেসের আইপি ঠিকানাটি সন্ধান করতে স্থানীয় রাউটিং টেবিলটি ব্যবহার করে যা নির্দিষ্ট বাহ্যিক হোস্টের সংযোগের জন্য ব্যবহৃত হবে। একটি সংযুক্ত ইউডিপি সকেট ব্যবহার করে আপনি কোনও প্যাকেট না প্রেরণ করে তথ্যটি পেতে পারেন। পদ্ধতির জন্য আপনাকে একটি নির্দিষ্ট বাহ্যিক হোস্ট চয়ন করতে হবে। বেশিরভাগ সময়, যে কোনও সুপরিচিত পাবলিক আইপিটির কৌশলটি করা উচিত। আমি এই উদ্দেশ্যে Google এর সর্বজনীন ডিএনএস সার্ভারের ঠিকানাটি 8.8.8.8 পছন্দ করি তবে আপনি বিভিন্ন বাহ্যিক হোস্ট আইপি চয়ন করতে চান এমন সময়ও আসতে পারে। এখানে কিছু কোড যা সম্পূর্ণ পদ্ধতির চিত্রিত করে।

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);
}

4
এটি আমার প্রাইভেট আইপি 127 দেয় * *। *। *। হয়তো আমি নেটের পিছনে আছি?
ইউজিন

14

যেমন আপনি খুঁজে পেয়েছেন যে একটি একক "স্থানীয় আইপি ঠিকানা" বলে কোনও জিনিস নেই। একটি নির্দিষ্ট হোস্টে প্রেরণ করা যেতে পারে এমন স্থানীয় ঠিকানা কীভাবে তা সন্ধান করতে হবে তা এখানে।

  1. একটি ইউডিপি সকেট তৈরি করুন
  2. সকেটটিকে বাইরের ঠিকানায় সংযুক্ত করুন (শেষ পর্যন্ত স্থানীয় ঠিকানাটি পাবেন এমন হোস্ট)
  3. স্থানীয় ঠিকানা পেতে গোকস নাম ব্যবহার করুন

আমি এইভাবে কখনও এটি করি নি তবে আমি এটি পছন্দ করি। এটি ওএস রাউটিং টেবিলটি স্বয়ংক্রিয়ভাবে ব্যবহার করে এবং ইন্টারফেস তালিকার স্ক্যান করার চেয়ে অনেক সহজ।
Zan Lynx

5
এটি ধরে নিয়েছে যে বাইরের ঠিকানাটি কী হবে তা আপনি জানেন। তথ্য কেন্দ্রগুলিতে প্রায়শই এটি হয় না।
ক্রিস্টোফার

আপনি সর্বদা তিনটি চেষ্টা করতে পারেন যা বিভিন্ন মহাদেশে নির্ধারিত হয় (আইএএনএ এটি সহজ করে তোলে) এবং তিনটির মধ্যে সেরা দুটি গ্রহণ করুন।
জোশুয়া

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;
}

এই সমাধানের জন্য আপনাকে ধন্যবাদ, আমার জন্য দুর্দান্ত কাজ করে এবং অনেক পরিস্থিতিতে খুব কাজে আসে যখন আপনি কেবল ক্লি-প্রোগ্রামগুলি থেকে কিছু তথ্য পেতে চান
zitroneneis

যদিও ifconfig প্রয়োজনীয় ডেটা আউটপুট করে, আমি কোনও প্রোগ্রামকে এইভাবে ব্যবহার করে নিরুৎসাহিত করব। ইফকনফাইগের উত্সে প্রবেশ করা এবং এটি চালানো এবং আউটপুটকে বিশ্লেষণ করার চেয়ে কার্যকারিতা পাওয়ার পক্ষে এটি আরও অনেক ভাল।
জাউর নাসিবভ

4
@ মার্টিনমিসার: আলাদাভাবে "ইনাইট" এর পরে ":" অনুসন্ধান করে এটিকে ভাষা নিরপেক্ষ করে তুলেছে।
এরিক অ্যারোনস্টি

4
তারপরে আপনার অন্যান্য ভাষা রয়েছে যা লাতিন ভিত্তিক অক্ষর সেটও নয়। সলিউশন হ'ল কমান্ড সরঞ্জামগুলি ব্যবহার না করা, যেহেতু তারা পছন্দ মতো অবচিত হয় ifconfig। আপনার ipএখন ব্যবহার করা উচিত । সঠিক ভাষা নিরপেক্ষ আউটপুট উৎপন্ন প্রণালী সেট হয় LANGথেকে এনভায়রনমেন্ট ভেরিয়েবল Cমত:LANG=C ls -l
অ্যান্ডার্স

4
ধন্যবাদ এটি একটি সহজ এবং দুর্দান্ত সমাধান!
আহমদ আফকান্দেহ

5

আমি মনে করি না যে আপনার প্রশ্নের একটি সঠিক সঠিক উত্তর আছে। পরিবর্তে এখানে কীভাবে আপনি চান তার কাছাকাছি যাওয়ার উপায়গুলির একটি বৃহত বান্ডিল রয়েছে। সুতরাং এটি কীভাবে করা যায় তার জন্য আমি কিছু ইঙ্গিত সরবরাহ করব।

যদি কোনও মেশিনে 2 টিরও বেশি ইন্টারফেস থাকে (lo এক হিসাবে গণনা করা হয়) আপনার ডান ইন্টারফেসটিকে সহজেই স্বয়ংক্রিয়ায়িত করতে সমস্যা হবে। এটি কীভাবে করবেন তার কয়েকটি রেসিপি এখানে দেওয়া হল।

উদাহরণস্বরূপ, সমস্যাটি হ'ল যদি হোস্টগুলি কোনও NAT ফায়ারওয়ালের পিছনে ডিএমজেড থাকে যা পাবলিক আইপিকে কিছু ব্যক্তিগত আইপিতে পরিবর্তন করে এবং অনুরোধগুলি ফরোয়ার্ড করে। আপনার মেশিনে 10 টি ইন্টারফেস থাকতে পারে, তবে কেবলমাত্র একটি জনসাধারণের সাথে সম্পর্কিত।

এমনকি আপনি ডাবল-এনএটি-তে থাকলেও অটোডোটেকশন কাজ করে না, যেখানে আপনার ফায়ারওয়াল এমনকি উত্স-আইপিটিকে সম্পূর্ণ আলাদা কিছুতে অনুবাদ করে। সুতরাং আপনি এমনকি নিশ্চিত হতে পারবেন না যে ডিফল্ট রুটটি আপনার ইন্টারফেসটিকে সর্বজনীন ইন্টারফেসের সাথে নিয়ে যায়।

এটি ডিফল্ট রুটের মাধ্যমে সনাক্ত করুন

জিনিসগুলি অটোডেটেক্ট করার এটি আমার প্রস্তাবিত উপায় way

এর মতো কিছু 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আইপিভি 6 দিয়ে এই কৌশলটি ছাঁটাই করে না

পরিবেশ ব্যবহার করুন

এই জন্য একটি ভাল কার্যসংক্রান্ত নেই /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 উত্তর বলে মনে হচ্ছে ।

এটি ডিএলএনএর মতো করুন

মাতাল মানুষটির পথ যিনি নিজেকে অ্যালকোহলে ডুবিয়ে দেওয়ার চেষ্টা করেন

আপনি আপনার নেটওয়ার্কের সমস্ত ইউপিএনপি গেটওয়ে গণনা করার চেষ্টা করতে পারেন এবং এইভাবে কিছু "বাহ্যিক" জিনিসটির জন্য একটি উপযুক্ত রুট খুঁজে বের করতে পারেন। এটি এমনকি এমন কোনও পথে হতে পারে যেখানে আপনার ডিফল্ট রুটটি নির্দেশ করে না।

এ সম্পর্কে আরও তথ্যের জন্য সম্ভবত https://en.wikedia.org/wiki/Internet_Gateway_ ডিভাইস_প্রোটোকল দেখুন

আপনার ডিফল্ট রুট অন্য কোথাও নির্দেশ করলেও এটি আপনাকে সত্যিকারের সর্বজনীন ইন্টারফেস বলে ভাল ধারণা দেয়।

আরও আছে

যেখানে পাহাড়ের সাথে দেখা হয় নবীর

আইপিভি 6 রাউটারগুলি আপনাকে সঠিক আইপিভি 6 উপসর্গ দেওয়ার জন্য তাদের বিজ্ঞাপন দেয়। উপসর্গটি দেখে আপনাকে কিছুটা অভ্যন্তরীণ আইপি বা গ্লোবাল একটি রয়েছে কিনা সে সম্পর্কে একটি ইঙ্গিত দেয়।

কিছু উপযুক্ত গেটওয়ে সন্ধানের জন্য আপনি আইজিএমপি বা আইবিজিপি ফ্রেমের জন্য শুনতে পারেন।

2 ^ 32 এরও কম আইপি ঠিকানা রয়েছে। অতএব ল্যান লাগাতে সময় লাগবে না কেবল তাদের সমস্তকে পিং করতে। এটি আপনাকে বেশিরভাগ ইন্টারনেট আপনার দৃষ্টিকোণ থেকে অবস্থিত যেখানে একটি পরিসংখ্যানমূলক ইঙ্গিত দেয়। তবে আপনার উচিত বিখ্যাত https://de.wikedia.org/wiki/SQL_Slammer এর চেয়ে কিছুটা বেশি বোধগম্য হওয়া উচিত

আইসিএমপি এবং এমনকি এআরপি নেটওয়ার্ক সাইডব্যান্ড তথ্যের জন্য ভাল উত্স। এটি আপনাকেও সাহায্য করতে পারে।

আপনি আপনার সমস্ত নেটওয়ার্ক অবকাঠামো ডিভাইসগুলির সাথে যোগাযোগ করার জন্য ইথারনেট ব্রডকাস্ট ঠিকানাটি ব্যবহার করতে পারেন যা প্রায়শই DHCP (এমনকি DHCPv6) এর মতো সাহায্য করবে out

এই অতিরিক্ত তালিকাটি সম্ভবত অন্তহীন এবং সর্বদা অসম্পূর্ণ, কারণ নেটওয়ার্ক ডিভাইসের প্রতিটি নির্মাতারা কীভাবে তাদের নিজস্ব ডিভাইসগুলি স্বয়ংক্রিয়ভাবে সনাক্ত করতে পারে সে সম্পর্কে নতুনভাবে সুরক্ষা গর্ত আবিষ্কার করছে। যা প্রায়শই এমন কিছু সার্বজনীন ইন্টারফেস সনাক্ত করতে পারে যেখানে সেখানে এক হতে পারে না।

'নফ বলল। আউট


4

স্টিভ বেকার যা বলেছে সেগুলি সম্পর্কে, আপনি নেটডভাইস (7) ম্যান পৃষ্ঠাতে এসআইওসিজিআইজিএফসিএনএফ আইওসিটিএলের একটি বিবরণ খুঁজে পেতে পারেন ।

আপনার হোস্টের সমস্ত আইপি ঠিকানার তালিকা হয়ে গেলে, আপনি চান না এমন ঠিকানাগুলি ফিল্টার করার জন্য আপনাকে অ্যাপ্লিকেশন নির্দিষ্ট যুক্তি ব্যবহার করতে হবে এবং আশা করা যাচ্ছে যে আপনার একটি আইপি ঠিকানা বাকি আছে।


4

এটিকে হার্ড কোড করবেন না: এটি এমন ধরণের জিনিস যা পরিবর্তন করতে পারে। অনেকগুলি প্রোগ্রাম একটি কনফিগার ফাইলে পড়ার মাধ্যমে এবং যা যা বলবে তা করে কীসের সাথে আবদ্ধ থাকতে হবে তা নির্ধারণ করে। এইভাবে, আপনার প্রোগ্রামটিকে ভবিষ্যতে কোনও সময় এমন কোনও কিছুতে আবদ্ধ করা দরকার যা কোনও পাবলিক আইপি নয়, এটি এটি করতে পারে।


2

প্রশ্নটি যেমন লিনাক্সকে নির্দিষ্ট করে, মেশিনের আইপি-ঠিকানাগুলি আবিষ্কার করার জন্য আমার প্রিয় কৌশলটি নেট লিঙ্ক ব্যবহার করা। প্রোটোকল NETLINK_ROUTE এর নেটলিঙ্ক সকেট তৈরি করে এবং একটি আরটিএম_জিইটিডিডিআর প্রেরণ দ্বারা, আপনার অ্যাপ্লিকেশনটি সমস্ত উপলভ্য আইপি ঠিকানা সম্বলিত একটি বার্তা (গুলি) পাবে। একটি উদাহরণ এখানে দেওয়া হয়

বার্তাটি হ্যান্ডলিংয়ের কিছু অংশের জন্য, libmnl সুবিধাজনক। আপনি যদি NETLINK_ROUTE (এবং কীভাবে তারা পার্স করা হয়) এর বিভিন্ন অপশন সম্পর্কে আরও জানতে আগ্রহী হন, তবে সেরা উত্স হ'ল আইপ্রুয়েট 2 (বিশেষত মনিটর অ্যাপ্লিকেশন) এর উত্স কোড এবং সেইসাথে কার্নেলের প্রাপ্ত ফাংশনগুলি। Rtnetlink এর ম্যান পেজেও দরকারী তথ্য রয়েছে।


1

আপনি কার্লের সাথে কিছু সহজ হিসাবে সহজ হিসাবে কিছু সংহত করতে পারেন: curl www.whatismyip.orgশেল থেকে আপনি আপনার গ্লোবাল আইপি পাবেন। আপনি কিছু বাহ্যিক সার্ভারের উপর নির্ভরশীল হন তবে আপনি কোনও NAT এর পিছনে থাকলে আপনি সর্বদা থাকবেন।


আমি কখনই বুঝতে পারি না কেন আরও লোকেরা এই সাইটটি ব্যবহার করে না। তাদের কাছে এমনকি একটি মেশিন পঠনযোগ্য পৃষ্ঠা রয়েছে যাতে আপনাকে তথ্য স্ক্র্যাপ করতে হবে না।
deft_code

4
আপনি যদি প্রক্সিটির ভিতরে কাজ করে থাকেন তবে আপনি সঠিক আইপি পেতে পারেন না।
জ্যাক

4
আইকানহাজিপ.কম আইপি এবং আরও কিছু দেয় না। ব্যাশ স্ক্রিপ্টে এম্বেড করার জন্য উপযুক্ত!
লুচ্চেকা

ipinfo.io/ip আরেকটি বিকল্প। আপনি ipinfo.io কার্ল করলে এটি হোস্ট-নেম, ভূ-অবস্থান তথ্য এবং জেএসওএন ফর্ম্যাটে আরও অনেক কিছু দেয়।
বেন ডওলিং


-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
এটি একটি ভারী, উইন্ডোজ-কেবল (লিনাক্স সম্পর্কে প্রশ্ন), ওয়েবসাইটের সামগ্রীর ভঙ্গুর বিশ্লেষণের মাধ্যমে স্থানীয় নিয়ন্ত্রণের বাইরে সার্ভিসের উপর নির্ভর করে ফর্ম্যাটযুক্ত সমাধান। এই "সমাধান" এর কোনও ইতিবাচক দিক খুঁজে পাচ্ছেন না।
ভাইরাপোর

4
হাহ! এইচটিএমএল পার্সিং এমনকি এমন একটি মন্তব্য সন্ধান করে যা ঠিক কী করা হচ্ছে সে সম্পর্কে একটি সতর্কতা।
18:23
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.