যে সার্ভারে আমার সি # অ্যাপ্লিকেশন চালু আছে তার আইপি ঠিকানা কীভাবে পাবেন?


365

আমি একটি সার্ভার চালাচ্ছি, এবং আমি নিজের আইপি ঠিকানাটি প্রদর্শন করতে চাই।

কম্পিউটারের নিজস্ব (যদি সম্ভব হয়, বাহ্যিক) আইপি ঠিকানা পাওয়ার সিনট্যাক্সটি কী?

কেউ নিম্নলিখিত কোড লিখেছেন।

IPHostEntry host;
string localIP = "?";
host = Dns.GetHostEntry(Dns.GetHostName());
foreach (IPAddress ip in host.AddressList)
{
    if (ip.AddressFamily.ToString() == "InterNetwork")
    {
        localIP = ip.ToString();
    }
}
return localIP;

তবে আমি সাধারণত লেখককে অবিশ্বস্ত করি এবং আমি এই কোডটি বুঝতে পারি না। এটি করার আরও ভাল উপায় আছে?


1
বাহ্যিক আইপি ঠিকানা সম্পর্কে, আমি মনে করি না যে এটি পুনরুদ্ধার করার জন্য কোনও স্থানীয় পদ্ধতি রয়েছে। লোকালহোস্ট এমন কোনও NAT রাউটারের পিছনে থাকতে পারে যা স্থানীয় নেটওয়ার্কের ঠিকানাগুলিকে জনসাধারণের কাছে অনুবাদ করে। ঘটনাটি যাচাই করার কোনও (স্থানীয়) উপায় আছে কি? আমি কারও সম্পর্কে জানি না ...
থিয়াগো অ্যারেইস

আইপি-ঠিকানা পেতে নমুনাটি ডিএনএস ব্যবহার করে, আমার ডিএনএসের ভুল তথ্য থাকার অভিজ্ঞতা আছে experience সেক্ষেত্রে নমুনাটি ভুল তথ্যের সাথে প্রতিক্রিয়া জানাতে পারে ।
লেফ্লুন্ডগ্রেন

@leiflundgren আমারও ভুল তথ্য থাকার সাথে ডিএনএস নিয়ে অভিজ্ঞতা হয়েছে। আমার উত্তর বর্ণনা করে যে আমি যখন ডিএনএসের উপর নির্ভর না করে আমার যে আইপি ঠিকানাটি পেয়েছিলাম তা কীভাবে পেয়েছি।
ডক্টর উইলির শিক্ষানবিশ

13
লিনকিউ ব্যবহার:Dns.GetHostEntry(Dns.GetHostName()).AddressList.Where(o => o.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).First().ToString()
লুইস পেরেজ

2
এটি একটি সাধারণ পরিস্থিতি যেখানে সম্পূর্ণ ভিন্ন প্রয়োজনের ব্যবহারকারীরা একই প্রশ্ন জিজ্ঞাসা করেন। কিছু লোকেরা জানতে চান যে কীভাবে তাদের কম্পিউটারে পাবলিক নেটওয়ার্ক থেকে পৌঁছানো যায়। প্রচলিত উত্তরটি স্টান , যদিও অনেক উত্তর উত্তরহীন তৃতীয় পক্ষের উপর নির্ভর করে with কিছু লোক কেবল স্থানীয় নেটওয়ার্ক (গুলি) এ তাদের আইপি ঠিকানা (এস) জানতে চান। এক্ষেত্রে ভাল উত্তরগুলিতে নেটওয়ার্কআইন্টারফেসের কথা উল্লেখ করুন NGetAllNetworkInterfaces পদ্ধতিটি
স্টাফেন গ্যারিচন

উত্তর:


237

নাহ, এটি করার পক্ষে এটি বেশ ভাল উপায়। যেহেতু একটি মেশিনে বেশ কয়েকটি আইপি ঠিকানা থাকতে পারে আপনার যথাযথ কোনও সন্ধানের জন্য এগুলির সংগ্রহ পুনরাবৃত্তি করতে হবে।

সম্পাদনা করুন: কেবলমাত্র আমি যেটি পরিবর্তন করব তা হ'ল এটি পরিবর্তন করা:

if (ip.AddressFamily.ToString() == "InterNetwork")

এটি:

if (ip.AddressFamily == AddressFamily.InterNetwork)

ToStringতুলনা করার জন্য একটি গণনার দরকার নেই ।


3
আমি যদি সম্ভব হয় তবে আমি বাহ্যিক আইপি ঠিকানা চাই। আমি মনে করি NAT এর পিছনে থাকলে এটি সম্ভব হবে না।
নেফজেন

3
না, আপনার মেশিনটি কেবল তার NAT ঠিকানা জানবে।
অ্যান্ড্রু হরে

1
আমি বেশ নিশ্চিত যে আপনাকে বাহ্যিক ঠিকানার জন্য একটি বাহ্যিক সার্ভারে পৌঁছাতে হবে।
থিয়াগো অ্যারেইস

29
breakসংগ্রহের মাধ্যমে অপ্রয়োজনীয়ভাবে আরও পুনরাবৃত্তি এড়াতে আইপি সন্ধান পাওয়ার পরে আমি একটি বিবৃতিও সুপারিশ করবো (এই ক্ষেত্রে আমি পারফরম্যান্সের প্রভাবটি যেভাবে প্রভাব ফেলবে তা নিয়ে সন্দেহ করি তবে আমি সাধারণত ভাল কোডিংয়ের অভ্যাসকে জোর দিতে চাই)
এরিক জে ২

7
মনে রাখবেন যে কোনও মেশিনের একাধিক 'ইন্টারনেট ওয়ার্ক' পোর্ট থাকলে এটি ব্যর্থ হতে পারে (আমার ক্ষেত্রে: একটি ইথারনেট কার্ড একটি ভার্চুয়াল মেশিন পোর্ট)। বর্তমান কোডটি আপনাকে তালিকার শেষ আইপি দেবে।
খ্রিস্টান স্টাডার

168

আপনার সর্বজনীন আইপি জানার একমাত্র উপায় হ'ল অন্য কাউকে আপনাকে বলার জন্য জিজ্ঞাসা করা; এই কোড আপনাকে সাহায্য করতে পারে:

public string GetPublicIP()
{
    String direction = "";
    WebRequest request = WebRequest.Create("http://checkip.dyndns.org/");
    using (WebResponse response = request.GetResponse())
    using (StreamReader stream = new StreamReader(response.GetResponseStream()))
    {
        direction = stream.ReadToEnd();
    }

    //Search for the ip in the html
    int first = direction.IndexOf("Address: ") + 9;
    int last = direction.LastIndexOf("</body>");
    direction = direction.Substring(first, last - first);

    return direction;
}

20
আপনি কি জানেন যে আপনার কোডের নমুনাটি প্রশ্নোত্তর 13 তম সি তে # মাইক্রোসফ্ট একাডেমিতে ব্যাখ্যা করা প্রশ্নগুলিতে উল্লেখ করা হয়েছিল? উপস্থাপক আপনার কোড চুরি করার জন্য ক্ষমা চান। সাড়ে আট মিনিট থেকে। এই দেখুন । :)
এরউইন রুইজাকারস

4
দুর্ভাগ্যক্রমে লিঙ্কটি মারা গেছে।
ব্যারি গুভেনকায়া

যে কেউ এটি দেখতে চাইলে নতুন লিঙ্ক
কিম্যাক্স

1
দয়া করে লিঙ্কটি ipof.in/txt ব্যবহার করুন যাতে আপনি সমস্ত HTML পার্সিং কোড ছাড়াই সরাসরি আইপি পেতে পারেন
বিবেক ২

82

ক্লিনার এবং এক সব সমাধান: ডি

//This returns the first IP4 address or null
return Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);

3
এই কোড সহ সমস্যা: * এটি ধরে নিয়েছে যে একটি কম্পিউটারের কেবলমাত্র একটি আইপি ঠিকানা রয়েছে। অনেকের একাধিক রয়েছে। * এটি কেবলমাত্র আইপিভি 4 ঠিকানা বিবেচনা করে। আইপিভি 6 অন্তর্ভুক্ত করতে ইন্টারনেট ওয়ার্কভি 6 যুক্ত করুন।
রবার্ট ব্র্যাটন

1
@ রবার্ট ব্র্যাটন, আপনার রিপ্লে জন্য ধন্যবাদ। সমস্যাটি একাধিক আইপি ঠিকানা বা আইপিভি 6 ধরে নি, এই কোডটিতে সামান্য পরিবর্তন করে এটি নির্দিষ্ট বিভিন্ন সমস্যা পরিচালনা করতে পারে।
মোহাম্মদ এ ফাদিল

50

আপনি যদি কোনও ডিএনএস সার্ভার (যা আমার কাছে হয়েছে) থেকে আপনার আইপি ঠিকানা পাওয়ার উপর নির্ভর করতে না পারেন, আপনি নিম্নলিখিত পদ্ধতির ব্যবহার করতে পারেন:

সিস্টেম.নেট. নেট ওয়ার্ক ইনফর্মেশন নেমস্পেসে একটি নেটওয়ার্ক ইন্টারফেস ক্লাস রয়েছে , যার স্ট্যাটিক গেটএলনেটওয়ার্কআইন্টারফেস পদ্ধতি রয়েছে

এই পদ্ধতিটি আপনার মেশিনে সমস্ত "নেটওয়ার্ক ইন্টারফেস" ফিরিয়ে দেবে, এবং সাধারণত আপনার কম্পিউটারে কেবল একটি বেতার অ্যাডাপ্টার এবং / অথবা একটি ইথারনেট অ্যাডাপ্টার হার্ডওয়্যার ইনস্টল থাকলেও বেশ কয়েকটি থাকে। এই সমস্ত নেটওয়ার্ক ইন্টারফেসের আপনার স্থানীয় মেশিনের জন্য বৈধ আইপি ঠিকানা রয়েছে, যদিও আপনি সম্ভবত কেবল একটি চান।

যদি আপনি একটি আইপি ঠিকানা সন্ধান করছেন, তবে আপনাকে সঠিক ঠিকানা সনাক্ত না করা অবধি তালিকাটি ফিল্টার করতে হবে। আপনার সম্ভবত কিছু পরীক্ষা-নিরীক্ষা করা দরকার, তবে নিম্নলিখিত পদ্ধতির সাথে আমার সাফল্য ছিল:

  • যাচাই করে নিষ্ক্রিয় যে কোনও নেটওয়ার্কআইন্টারফেসগুলি ফিল্টার করুন OperationalStatus == OperationalStatus.Up । এটি আপনার শারীরিক ইথারনেট অ্যাডাপ্টারকে বাদ দেবে, উদাহরণস্বরূপ, আপনার যদি কোনও নেটওয়ার্কের কেবল প্লাগ ইন না থাকে।

প্রতিটি নেটওয়ার্কইন্টারফেসের জন্য আপনি getIPProperties পদ্ধতি ব্যবহার করে একটি IPInterfaceProperties অবজেক্ট পেতে পারেন এবং একটি IPInterfaceProperties অবজেক্ট থেকে আপনি ইউনিকাস্টিএপি অ্যাড্রেস বৈশিষ্ট্যটিতে ইউনিকাস্টিপিএড্রেসআইফর্মেশন তালিকার জন্য অ্যাক্সেস করতে পারবেন অবজেক্টের ।

  • চেক করে অ-পছন্দসই ইউনিকাস্টের ঠিকানাগুলি ফিল্টার আউট করুন DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred
  • "ভার্চুয়াল" ঠিকানাগুলি পরীক্ষার মাধ্যমে ফিল্টার আউট AddressPreferredLifetime != UInt32.MaxValue

এই মুহুর্তে আমি প্রথম (যদি কোনও হয়) ইউনিকাস্টের ঠিকানার ঠিকানা গ্রহণ করি যা এই সমস্ত ফিল্টারগুলির সাথে মেলে।

সম্পাদনা করুন:

[সদৃশ ঠিকানা সনাক্তকরণের স্থিতি এবং পছন্দসই আজীবনের জন্য উপরের লেখায় উল্লিখিত শর্তাদি অন্তর্ভুক্ত করতে 16 মে, 2018 এ সংশোধিত কোড]

নীচের নমুনাটি লুপব্যাকের ঠিকানা (127.0.0.1), সদৃশ ঠিকানা সনাক্তকরণের স্থিতি এবং পছন্দসই জীবনকাল বাদ দিয়ে অপারেশনাল স্ট্যাটাস, অ্যাড্রেস ফ্যামিলির উপর ভিত্তি করে ফিল্টারিং দেখায়।

static IEnumerable<IPAddress> GetLocalIpAddresses()
{
    // Get the list of network interfaces for the local computer.
    var adapters = NetworkInterface.GetAllNetworkInterfaces();

    // Return the list of local IPv4 addresses excluding the local
    // host, disconnected, and virtual addresses.
    return (from adapter in adapters
            let properties = adapter.GetIPProperties()
            from address in properties.UnicastAddresses
            where adapter.OperationalStatus == OperationalStatus.Up &&
                  address.Address.AddressFamily == AddressFamily.InterNetwork &&
                  !address.Equals(IPAddress.Loopback) &&
                  address.DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred &&
                  address.AddressPreferredLifetime != UInt32.MaxValue
            select address.Address);
}

2
এই বিশেষ ক্ষেত্রে, ওপি তার বাহ্যিক আইপি ঠিকানাটি দেখতে চেয়েছিল, তাই ডিএনএস সমাধান সম্ভবত যাওয়ার উপায়। তবে স্থানীয় আইপি ঠিকানাগুলি পুনরাবৃত্তি করার জন্য, আমি এটি প্রস্তাব করি approach
ম্যাট ডেভিস

3
সম্মত হন যে আইপি ঠিকানা পাওয়ার জন্য ডিএনএস হ'ল একটি সহজ উপায়। আমি আমার উত্তরে উল্লেখ করেছি যে আপনার ডিএনএস অবিশ্বস্ত হলে এই পদ্ধতিটি কার্যকর হয়। আমি এটি এমন পরিবেশে ব্যবহার করেছি যেখানে ডিএনএস এমনভাবে গোলমাল হয়েছিল যে আপনি যদি একটি ইথারনেট পোর্ট থেকে অন্য কোনও মেশিনটি সরান, ডিএনএস এখনও পুরানো আইপি ঠিকানাটি রিপোর্ট করবে, তাই এটি আমার উদ্দেশ্যগুলির জন্য প্রায় অকেজো।
ডক্টর উইলির শিক্ষানবিশ

আমি সমস্ত বিবরণের প্রশংসা করি, তবে আপনার কোডের নমুনাও পোস্ট করা উচিত ছিল।
আইডিন

দুর্দান্ত ধন্যবাদ। নোট করুন যে সাম্প্রতিক উইন্ডোজ আপডেটের পরে, ইউনিকাস্ট অ্যাড্রেসগুলি। প্রথম অনুমান আর থাকে না। অ্যাড্রেসপ্রিফার্ডলিফটাইম এবং ডুপ্লিকেট অ্যাড্রেস ডিটেকশনস্টেশন (উপরে আপনার
লেখায়

37
WebClient webClient = new WebClient();
string IP = webClient.DownloadString("http://myip.ozymo.com/");

ifconfig.me/ip আর কাজ করে না। Api.ipify.org বা পরিবর্তে ডগের মন্তব্যে লিঙ্কটি চেষ্টা করুন
কেনেনি 83

16
using System.Net;

string host = Dns.GetHostName();
IPHostEntry ip = Dns.GetHostEntry(host);
Console.WriteLine(ip.AddressList[0].ToString());

এটি কেবল আমার মেশিনে পরীক্ষা করা হয়েছে এবং এটি কাজ করে।


3
এটি আপনার স্থানীয় আইপিটি পাবেন এবং প্রশ্নটি বাইরের আইপি সম্পর্কিত যা আইপিআইপি দিয়ে আপনি ইন্টারনেট ব্রাউজ করেন ..
সংগ্রাম নন্দখিল

15

আপনি যদি ডিএনএস ব্যবহার এড়াতে চান:

List<IPAddress> ipList = new List<IPAddress>();
foreach (var netInterface in NetworkInterface.GetAllNetworkInterfaces())
{
    foreach (var address in netInterface.GetIPProperties().UnicastAddresses)
    {
        if (address.Address.AddressFamily == AddressFamily.InterNetwork)
        {
            Console.WriteLine("found IP " + address.Address.ToString());
            ipList.Add(address.Address);
        }
    }
}

9

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

প্রথমে আমি রাউটারের ঠিকানা পেয়েছি (গেটওয়ে) যদি এটি ফিরে আসে যে আমি একটি গেটওয়েতে সংযুক্ত রয়েছি (যার অর্থ সরাসরি মডেম ওয়্যারলেসে সংযুক্ত নেই বা না) তবে আমাদের আইপিএড্রেস হিসাবে আমাদের গেটওয়ের ঠিকানা রয়েছে অন্যথায় আমরা একটি নাল পয়েন্টার আইপিএড্রেস রেফারেন্স করব ।

তারপরে আমাদের আইপিএড্রেসগুলির কম্পিউটারের তালিকা পেতে হবে। এখানেই জিনিসগুলি এতটা কঠিন নয় কারণ রাউটারগুলি (সমস্ত রাউটারগুলি) 4 বাইট (...) ব্যবহার করে। প্রথম তিনটি সবচেয়ে গুরুত্বপূর্ণ কারণ এর সাথে সংযুক্ত যে কোনও কম্পিউটারে আইপি 4 ঠিকানাটি প্রথম তিনটি বাইটের সাথে মিলবে। প্রাক্তন: 192.168.0.1 রাউটার ডিফল্ট আইপি এর প্রশাসক দ্বারা পরিবর্তিত না হলে মান is '192.168.0' বা সেগুলি যাই হোক না কেন সেগুলি আমাদের মেলে। এবং এটিই আমি ইসএড্রেসঅফগেটওয়ে ফাংশনে করেছি। দৈর্ঘ্যের মিলের কারণ হ'ল সমস্ত ঠিকানার (যা কেবল কম্পিউটারের জন্য) 4 বাইটের দৈর্ঘ্য নেই। আপনি যদি সেমিডিতে নেটস্ট্যাট টাইপ করেন তবে আপনি এটি সত্য বলে খুঁজে পাবেন। তাই সেখানে যদি আপনি এটি আছে। হ্যাঁ, আপনি যা খুঁজছেন তা পেতে এটি পেতে আরও কিছুটা সময় লাগবে। নির্মূল প্রক্রিয়া। এবং sakeশ্বরের দোহাই, সময় লাগলে পিং দিয়ে ঠিকানাটি খুঁজে পাবেন না কারণ প্রথমে আপনি ঠিকানাটি পিন করতে পাঠাচ্ছেন এবং তারপরে ফলাফলটি ফেরত পাঠাতে হবে। না, নেট সিস্টেমের সাথে সরাসরি কাজ করুন যা আপনার সিস্টেমের পরিবেশের সাথে সম্পর্কিত এবং আপনি যখন আপনার কম্পিউটারের সাথে সম্পূর্ণরূপে করতে হবে তখন আপনি যে উত্তরগুলি সন্ধান করছেন তা পেয়ে যাবেন।

এখন আপনি যদি সরাসরি আপনার মডেমের সাথে সংযুক্ত থাকেন তবে প্রক্রিয়াটি প্রায় একই কারণ মডেমটি আপনার গেটওয়ে তবে সাবমাস্কটি একই নয় কারণ আপনি আপনার ডিএনএস সার্ভারের মাধ্যমে মডেমের মাধ্যমে সরাসরি তথ্য পেয়েছেন এবং রাউটারটি পরিবেশন করে না the ইন্টারনেট আপনার কাছে যদিও আপনি এখনও একই কোডটি ব্যবহার করতে পারবেন কারণ মডেমের জন্য নির্ধারিত আইপিটির শেষ বাইটটি 1 So তাই যদি মডেম থেকে পরিবর্তিত আইপি 111.111.111.1 হয় তবে আপনি 111.111.111 পাবেন some (কিছু বাইট মান)। আমাদের গেটওয়ের তথ্য সন্ধান করতে হবে তা মনে রাখবেন কারণ এমন আরও অনেকগুলি ডিভাইস রয়েছে যা আপনার রাউটার এবং মডেমের চেয়ে ইন্টারনেট সংযোগ নিয়ে কাজ করে।

এখন আপনি দেখতে পান যে আপনি কেন রাউটারের প্রথম দুটি বাইট 192 এবং 168 পরিবর্তন করবেন না These এটি কেবলমাত্র রাউটারের জন্য এবং কেবল ইন্টারনেট ব্যবহারের জন্যই আলাদা নয় বা আইপি প্রোটোকল এবং ডাবল পিংয়ের ক্ষেত্রে আমাদের একটি গুরুতর সমস্যা রয়েছে যার ফলে আপনার কম্পিউটারটি ক্রাশ হয়। আপনার নির্ধারিত রাউটারের আইপি 192.168.44.103 এবং আপনি সেই আইপি সহ কোনও সাইটে ক্লিক করেন এমন চিত্র। ঈশ্বর! আপনার কম্পিউটারটি কী পিং করতে হবে তা জানত না। ঠিক সেখানেই ক্রাশ। এই সমস্যাটি এড়াতে, কেবল রাউটারগুলিকে ইন্টারনেট ব্যবহারের জন্য নয় এগুলি বরাদ্দ করা হয়। সুতরাং রাউটারের প্রথম দুটি বাইট একা রেখে দিন।

static IPAddress FindLanAddress()
{
    IPAddress gateway = FindGetGatewayAddress();
    if (gateway == null)
        return null;

    IPAddress[] pIPAddress = Dns.GetHostAddresses(Dns.GetHostName());

    foreach (IPAddress address in pIPAddress)            {
        if (IsAddressOfGateway(address, gateway))
                return address;
    return null;
}
static bool IsAddressOfGateway(IPAddress address, IPAddress gateway)
{
    if (address != null && gateway != null)
        return IsAddressOfGateway(address.GetAddressBytes(),gateway.GetAddressBytes());
    return false;
}
static bool IsAddressOfGateway(byte[] address, byte[] gateway)
{
    if (address != null && gateway != null)
    {
        int gwLen = gateway.Length;
        if (gwLen > 0)
        {
            if (address.Length == gateway.Length)
            {
                --gwLen;
                int counter = 0;
                for (int i = 0; i < gwLen; i++)
                {
                    if (address[i] == gateway[i])
                        ++counter;
                }
                return (counter == gwLen);
            }
        }
    }
    return false;

}
static IPAddress FindGetGatewayAddress()
{
    IPGlobalProperties ipGlobProps = IPGlobalProperties.GetIPGlobalProperties();

    foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
    {
        IPInterfaceProperties ipInfProps = ni.GetIPProperties();
        foreach (GatewayIPAddressInformation gi in ipInfProps.GatewayAddresses)
            return gi.Address;
    }
    return null;
}

1
এটি অর্থবোধ করে না: ফোরচ (আইপিনফ্রপস.গেটওএএড্রেসস এ গেটওয়েআইপিএড্রেস ইনফর্মেশন জিআই) রিটার্ন জিআইএড্রেস;
এডউইন ইভান্স

3
কোনও গ্যারান্টি নেই যে "কোনও গেটওয়েতে সংযুক্ত যে কোনও কম্পিউটারে প্রথম তিনটি বাইটের সাথে মিলে আইপি 4 ঠিকানা থাকবে"। এটি সাবনেট মাস্কের উপর নির্ভর করে, এতে বিভিন্ন বিটের সংমিশ্রণ থাকতে পারে। এবং তদ্ব্যতীত, এখানে বর্ণিত হিসাবে বাইটগুলি শুরু করতে "192.168" থাকতে হবে না । এই কোডটি কেবল তখনই কাজ করবে যদি সাবনেট মাস্ক হয় 255.255.255.0এবং এটি জটিল জটিল আইএমওতে এটি করবে।
গ্রো

8

আমি কেবল ভেবেছিলাম যে আমি নিজের নিজস্ব, এক-লাইনার যুক্ত করব (যদিও ইতিমধ্যে আরও অনেক দরকারী উত্তর রয়েছে)।


string ipAddress = new WebClient().DownloadString("http://icanhazip.com");


4
মনে রাখবেন এটির একটি সম্ভাব্য মেমরি ফুটো রয়েছে। ওয়েবক্লিয়েন্টটি সঠিকভাবে নিষ্পত্তি হয় না। পরিবর্তে, ব্যবহার করুন: (var ক্লায়েন্ট = নতুন ওয়েবক্লিয়েন্ট ()) ব্যবহার করুন client রিটার্ন ক্লায়েন্ট।ডাউনলোডস্ট্রিং (" আইকানহাজিপ ডটকম /")। ট্রিম () ; }
এফইও

4

বর্তমান সার্বজনীন আইপি ঠিকানা পাওয়ার জন্য, আপনাকে যা করতে হবে তা হ'ল পৃষ্ঠা লোড ইভেন্টে নিম্নলিখিত লাইনের সাথে একটি এএসপিএক্স পৃষ্ঠা তৈরি করা উচিত:

Response.Write(HttpContext.Current.Request.UserHostAddress.ToString());

4

আপনি যদি ইন্ট্রানেটে চলমান থাকেন তবে আপনি স্থানীয় মেশিনের আইপি ঠিকানা পেতে সক্ষম হবেন এবং যদি না পান তবে আপনি এটির সাথে বাইরের আইপি ঠিকানা পাবেন: ওয়েব:

//this will bring the IP for the current machine on browser
System.Web.HttpContext.Current.Request.UserHostAddress

ডেস্কটপ:

//This one will bring all local IPs for the desired namespace
IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());

3
namespace NKUtilities 
{
    using System;
    using System.Net;
    using System.Net.Sockets;

    public class DNSUtility
    {
        public static int Main(string [] args)
        {
            string strHostName = "";
            try {

                if(args.Length == 0)
                {
                    // Getting Ip address of local machine...
                    // First get the host name of local machine.
                    strHostName = Dns.GetHostName();
                    Console.WriteLine ("Local Machine's Host Name: " +  strHostName);
                }
                else
                {
                    // Otherwise, get the IP address of the host provided on the command line.
                    strHostName = args[0];
                }

                // Then using host name, get the IP address list..
                IPHostEntry ipEntry = Dns.GetHostEntry (strHostName);
                IPAddress [] addr = ipEntry.AddressList;

                for(int i = 0; i < addr.Length; i++)
                {
                    Console.WriteLine("IP Address {0}: {1} ", i, addr[i].ToString());
                }
                return 0;

            } 
            catch(SocketException se) 
            {
                Console.WriteLine("{0} ({1})", se.Message, strHostName);
                return -1;
            } 
            catch(Exception ex) 
            {
                Console.WriteLine("Error: {0}.", ex.Message);
                return -1;
            }
        }
    }
}

দেখুন এখানে বিস্তারিত জানার জন্য।

আপনার মনে রাখতে হবে যে আপনার কম্পিউটারে একাধিক আইপি থাকতে পারে (আসলে এটি সর্বদা হয়) - তবে আপনি কোনটি পরে আছেন।


2

এটা চেষ্টা কর:

 IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
 String MyIp = localIPs[0].ToString();

1
এটি বেশ কয়েকটি স্থানীয় আইপি অ্যাড্রেস প্রদান করে, যার মধ্যে একটি আইপিভি 4 ঠিকানা, তবে তালিকার সঠিক ঠিকানাটি খুঁজে পাওয়া শক্ত।
কনটাঙ্গো

1

বাহ্যিক আইপি দ্বারা আপনি এটি ব্যবহার করে বিবেচনা করতে পারেন (আপনি যদি ওয়েব সার্ভারের প্রসঙ্গে থাকেন)

Request.ServerVariables["LOCAL_ADDR"];

আমি আপনার মত একই প্রশ্ন জিজ্ঞাসা করেছি এবং আমি এই স্ট্যাকওভারফ্লো নিবন্ধে এটি পেয়েছি ।

এটা আমার জন্য কাজ করেছে।


1
namespace NKUtilities 
{
    using System;
    using System.Net;

    public class DNSUtility
    {
        public static int Main (string [] args)
        {

          String strHostName = new String ("");
          if (args.Length == 0)
          {
              // Getting Ip address of local machine...
              // First get the host name of local machine.
              strHostName = Dns.GetHostName ();
              Console.WriteLine ("Local Machine's Host Name: " +  strHostName);
          }
          else
          {
              strHostName = args[0];
          }

          // Then using host name, get the IP address list..
          IPHostEntry ipEntry = DNS.GetHostByName (strHostName);
          IPAddress [] addr = ipEntry.AddressList;

          for (int i = 0; i < addr.Length; i++)
          {
              Console.WriteLine ("IP Address {0}: {1} ", i, addr[i].ToString ());
          }
          return 0;
        }    
     }
}

1
using System;
using System.Net;

namespace IPADDRESS
{
    class Program
    {
        static void Main(string[] args)
        {
            String strHostName = string.Empty;
            if (args.Length == 0)
            {                
                /* First get the host name of local machine.*/
                strHostName = Dns.GetHostName();
                Console.WriteLine("Local Machine's Host Name: " + strHostName);
            }
            else
            {
                strHostName = args[0];
            }
            /* Then using host name, get the IP address list..*/
            IPHostEntry ipEntry = Dns.GetHostByName(strHostName);
            IPAddress[] addr = ipEntry.AddressList;
            for (int i = 0; i < addr.Length; i++)
            {
                Console.WriteLine("IP Address {0}: {1} ", i, addr[i].ToString());
            }
            Console.ReadLine();
        }
    }
}

1
return Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);

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

আমি অনুমান করি নলের পরিবর্তে লুপব্যাক ফিরে পাওয়া সহজ:

return Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork) ?? new IPAddress( new byte[] {127, 0, 0, 1} );

1
কীভাবে IPAddress.Loopback? :)
থেরাপিস্ট

1

আইপি অ্যাড্রেস তালিকার সন্ধান করতে আমি এই সমাধানটি ব্যবহার করেছি

public static IEnumerable<string> GetAddresses()
{
    var host = Dns.GetHostEntry(Dns.GetHostName());
    return (from ip in host.AddressList where ip.AddressFamily == AddressFamily.lo select ip.ToString()).ToList();
}

তবে আমি স্থানীয় বৈধ আইপি ঠিকানা পেতে ব্যক্তিগতভাবে নীচের সমাধানটি পছন্দ করি

public static IPAddress GetIPAddress(string hostName)
{
    Ping ping = new Ping();
    var replay = ping.Send(hostName);

    if (replay.Status == IPStatus.Success)
    {
        return replay.Address;
    }
    return null;
 }

public static void Main()
{
    Console.WriteLine("Local IP Address: " + GetIPAddress(Dns.GetHostName()));
    Console.WriteLine("Google IP:" + GetIPAddress("google.com");
    Console.ReadLine();
}

1

লিনকিউ সমাধান:

Dns.GetHostEntry(Dns.GetHostName()).AddressList.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork).Select(ip => ip.ToString()).FirstOrDefault() ?? ""

1

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

private string FetchIP()
{
    //Get all IP registered
    List<string> IPList = new List<string>();
    IPHostEntry host;
    host = Dns.GetHostEntry(Dns.GetHostName());
    foreach (IPAddress ip in host.AddressList)
    {
        if (ip.AddressFamily == AddressFamily.InterNetwork)
        {
            IPList.Add(ip.ToString());
        }
    }

    //Find the first IP which is not only local
    foreach (string a in IPList)
    {
        Ping p = new Ping();
        string[] b = a.Split('.');
        string ip2 = b[0] + "." + b[1] + "." + b[2] + ".1";
        PingReply t = p.Send(ip2);
        p.Dispose();
        if (t.Status == IPStatus.Success && ip2 != a)
        {
            return a;
        }
    }
    return null;
}


1

লিনকিউ ব্যবহার করে স্ট্রিং হিসাবে সমস্ত আইপি ঠিকানা পান:

using System.Linq;
using System.Net.NetworkInformation;
using System.Net.Sockets;
...
string[] allIpAddresses = NetworkInterface.GetAllNetworkInterfaces()
    .SelectMany(c=>c.GetIPProperties().UnicastAddresses
        .Where(d=>d.Address.AddressFamily == AddressFamily.InterNetwork)
        .Select(d=>d.Address.ToString())
    ).ToArray();

ব্যক্তিগত ব্যক্তিগত ফিল্টার করতে ...

প্রথমে একটি এক্সটেনশন পদ্ধতিটি নির্ধারণ করুন IsPrivate():

public static class IPAddressExtensions
{
    // Collection of private CIDRs (IpAddress/Mask) 
    private static Tuple<int, int>[] _privateCidrs = new []{"10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"}
        .Select(c=>Tuple.Create(BitConverter.ToInt32(IPAddress
                                    .Parse(c.Split('/')[0]).GetAddressBytes(), 0)
                              , IPAddress.HostToNetworkOrder(-1 << (32-int.Parse(c.Split('/')[1])))))
        .ToArray();
    public static bool IsPrivate(this IPAddress ipAddress)
    {
        int ip = BitConverter.ToInt32(ipAddress.GetAddressBytes(), 0);
        return _privateCidrs.Any(cidr=>(ip & cidr.Item2)==(cidr.Item1 & cidr.Item2));           
    }
}

... এবং তারপরে এটি ব্যক্তিগত আইপি ফিল্টার করতে ব্যবহার করুন:

string[] publicIpAddresses = NetworkInterface.GetAllNetworkInterfaces()
    .SelectMany(c=>c.GetIPProperties().UnicastAddresses
        .Where(d=>d.Address.AddressFamily == AddressFamily.InterNetwork
            && !d.Address.IsPrivate() // Filter out private ones
        )
        .Select(d=>d.Address.ToString())
    ).ToArray();

1

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

// ************************************************************************
/// <summary>
/// Will search for the an active NetworkInterafce that has a Gateway, otherwise
/// it will fallback to try from the DNS which is not safe.
/// </summary>
/// <returns></returns>
public static NetworkInterface GetMainNetworkInterface()
{
    List<NetworkInterface> candidates = new List<NetworkInterface>();

    if (NetworkInterface.GetIsNetworkAvailable())
    {
        NetworkInterface[] NetworkInterfaces =
            NetworkInterface.GetAllNetworkInterfaces();

        foreach (
            NetworkInterface ni in NetworkInterfaces)
        {
            if (ni.OperationalStatus == OperationalStatus.Up)
                candidates.Add(ni);
        }
    }

    if (candidates.Count == 1)
    {
        return candidates[0];
    }

    // Accoring to our tech, the main NetworkInterface should have a Gateway 
    // and it should be the ony one with a gateway.
    if (candidates.Count > 1)
    {
        for (int n = candidates.Count - 1; n >= 0; n--)
        {
            if (candidates[n].GetIPProperties().GatewayAddresses.Count == 0)
            {
                candidates.RemoveAt(n);
            }
        }

        if (candidates.Count == 1)
        {
            return candidates[0];
        }
    }

    // Fallback to try by getting my ipAdress from the dns
    IPAddress myMainIpAdress = null;
    IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
    foreach (IPAddress ip in host.AddressList)
    {
        if (ip.AddressFamily == AddressFamily.InterNetwork) // Get the first IpV4
        {
            myMainIpAdress = ip;
            break;
        }
    }

    if (myMainIpAdress != null)
    {
        NetworkInterface[] NetworkInterfaces =
            NetworkInterface.GetAllNetworkInterfaces();

        foreach (NetworkInterface ni in NetworkInterfaces)
        {
            if (ni.OperationalStatus == OperationalStatus.Up)
            {
                IPInterfaceProperties props = ni.GetIPProperties();
                foreach (UnicastIPAddressInformation ai in props.UnicastAddresses)
                {
                    if (ai.Address.Equals(myMainIpAdress))
                    {
                        return ni;
                    }
                }
            }
        }
    }

    return null;
}

// ******************************************************************
/// <summary>
/// AddressFamily.InterNetwork = IPv4
/// Thanks to Dr. Wilys Apprentice at
/// http://stackoverflow.com/questions/1069103/how-to-get-the-ip-address-of-the-server-on-which-my-c-sharp-application-is-runni
/// using System.Net.NetworkInformation;
/// </summary>
/// <param name="mac"></param>
/// <param name="addressFamily">AddressFamily.InterNetwork = IPv4,  AddressFamily.InterNetworkV6 = IPv6</param>
/// <returns></returns>
public static IPAddress GetIpFromMac(PhysicalAddress mac, AddressFamily addressFamily = AddressFamily.InterNetwork)
{
    NetworkInterface[] NetworkInterfaces =
        NetworkInterface.GetAllNetworkInterfaces();

    foreach (NetworkInterface ni in NetworkInterfaces)
    {
        if (ni.GetPhysicalAddress().Equals(mac))
        {
            if (ni.OperationalStatus == OperationalStatus.Up)
            {
                IPInterfaceProperties props = ni.GetIPProperties();
                foreach (UnicastIPAddressInformation ai in props.UnicastAddresses)
                {
                    if (ai.DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred)
                    {
                        if (ai.Address.AddressFamily == addressFamily)
                        {
                            return ai.Address;
                        }
                    }
                }
            }
        }
    }

    return null;
}

// ******************************************************************
/// <summary>
/// Return the best guess of main ipAdress. To get it in the form aaa.bbb.ccc.ddd just call 
/// '?.ToString() ?? ""' on the result.
/// </summary>
/// <returns></returns>
public static IPAddress GetMyInternetIpAddress()
{
    NetworkInterface ni = GetMainNetworkInterface();
    IPAddress ipAddress = GetIpFromMac(ni.GetPhysicalAddress());
    if (ipAddress == null) // could it be possible ?
    {
        ipAddress = GetIpFromMac(ni.GetPhysicalAddress(), AddressFamily.InterNetworkV6);
    }

    return ipAddress;
}

// ******************************************************************

রেফারেন্স হিসাবে এটি সম্পূর্ণ শ্রেণীর কোড যেখানে আমি এটি সংজ্ঞায়িত করেছি:

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Threading.Tasks;

namespace TcpMonitor
{
    /*
        Usage:
                var cons = TcpHelper.GetAllTCPConnections();
                foreach (TcpHelper.MIB_TCPROW_OWNER_PID c in cons) ...
    */

    public class NetHelper
    {
        [DllImport("iphlpapi.dll", SetLastError = true)]
        static extern uint GetExtendedUdpTable(IntPtr pUdpTable, ref int dwOutBufLen, bool sort, int ipVersion, UDP_TABLE_CLASS tblClass, uint reserved = 0);

        public enum UDP_TABLE_CLASS
        {
            UDP_TABLE_BASIC,
            UDP_TABLE_OWNER_PID,
            UDP_TABLE_OWNER_MODULE
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_UDPTABLE_OWNER_PID
        {
            public uint dwNumEntries;
            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
            public MIB_UDPROW_OWNER_PID[] table;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_UDPROW_OWNER_PID
        {
            public uint localAddr;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] localPort;
            public uint owningPid;

            public uint ProcessId
            {
                get { return owningPid; }
            }

            public IPAddress LocalAddress
            {
                get { return new IPAddress(localAddr); }
            }

            public ushort LocalPort
            {
                get { return BitConverter.ToUInt16(localPort.Take(2).Reverse().ToArray(), 0); }
            }
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_UDP6TABLE_OWNER_PID
        {
            public uint dwNumEntries;
            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
            public MIB_UDP6ROW_OWNER_PID[] table;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_UDP6ROW_OWNER_PID
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            public byte[] localAddr;
            public uint localScopeId;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] localPort;
            public uint owningPid;
            public uint ProcessId
            {
                get { return owningPid; }
            }

            public IPAddress LocalAddress
            {
                get { return new IPAddress(localAddr, localScopeId); }
            }

            public ushort LocalPort
            {
                get { return BitConverter.ToUInt16(localPort.Take(2).Reverse().ToArray(), 0); }
            }
        }

        public static List<MIB_UDPROW_OWNER_PID> GetAllUDPConnections()
        {
            return GetUDPConnections<MIB_UDPROW_OWNER_PID, MIB_UDPTABLE_OWNER_PID> (AF_INET);
        }

        public static List<MIB_UDP6ROW_OWNER_PID> GetAllUDPv6Connections()
        {
            return GetUDPConnections<MIB_UDP6ROW_OWNER_PID, MIB_UDP6TABLE_OWNER_PID>(AF_INET6);
        }

        private static List<IPR> GetUDPConnections<IPR, IPT>(int ipVersion)//IPR = Row Type, IPT = Table Type
        {
            List<IPR> result = null;

            IPR[] tableRows = null;
            int buffSize = 0;

            var dwNumEntriesField = typeof(IPT).GetField("dwNumEntries");

            // how much memory do we need?
            uint ret = GetExtendedUdpTable(IntPtr.Zero, ref buffSize, true, ipVersion, UDP_TABLE_CLASS.UDP_TABLE_OWNER_PID);
            IntPtr udpTablePtr = Marshal.AllocHGlobal(buffSize);

            try
            {
                ret = GetExtendedUdpTable(udpTablePtr, ref buffSize, true, ipVersion, UDP_TABLE_CLASS.UDP_TABLE_OWNER_PID);
                if (ret != 0)
                    return new List<IPR>();

                // get the number of entries in the table
                IPT table = (IPT)Marshal.PtrToStructure(udpTablePtr, typeof(IPT));
                int rowStructSize = Marshal.SizeOf(typeof(IPR));
                uint numEntries = (uint)dwNumEntriesField.GetValue(table);

                // buffer we will be returning
                tableRows = new IPR[numEntries];

                IntPtr rowPtr = (IntPtr)((long)udpTablePtr + 4);
                for (int i = 0; i < numEntries; i++)
                {
                    IPR tcpRow = (IPR)Marshal.PtrToStructure(rowPtr, typeof(IPR));
                    tableRows[i] = tcpRow;
                    rowPtr = (IntPtr)((long)rowPtr + rowStructSize);   // next entry
                }
            }
            finally
            {
                result = tableRows?.ToList() ?? new List<IPR>();

                // Free the Memory
                Marshal.FreeHGlobal(udpTablePtr);
            }

            return result;
        }

        [DllImport("iphlpapi.dll", SetLastError = true)]
        static extern uint GetExtendedTcpTable(IntPtr pTcpTable, ref int dwOutBufLen, bool sort, int ipVersion, TCP_TABLE_CLASS tblClass, uint reserved = 0);



        public enum MIB_TCP_STATE
        {
            MIB_TCP_STATE_CLOSED = 1,
            MIB_TCP_STATE_LISTEN = 2,
            MIB_TCP_STATE_SYN_SENT = 3,
            MIB_TCP_STATE_SYN_RCVD = 4,
            MIB_TCP_STATE_ESTAB = 5,
            MIB_TCP_STATE_FIN_WAIT1 = 6,
            MIB_TCP_STATE_FIN_WAIT2 = 7,
            MIB_TCP_STATE_CLOSE_WAIT = 8,
            MIB_TCP_STATE_CLOSING = 9,
            MIB_TCP_STATE_LAST_ACK = 10,
            MIB_TCP_STATE_TIME_WAIT = 11,
            MIB_TCP_STATE_DELETE_TCB = 12
        }

        public enum TCP_TABLE_CLASS
        {
            TCP_TABLE_BASIC_LISTENER,
            TCP_TABLE_BASIC_CONNECTIONS,
            TCP_TABLE_BASIC_ALL,
            TCP_TABLE_OWNER_PID_LISTENER,
            TCP_TABLE_OWNER_PID_CONNECTIONS,
            TCP_TABLE_OWNER_PID_ALL,
            TCP_TABLE_OWNER_MODULE_LISTENER,
            TCP_TABLE_OWNER_MODULE_CONNECTIONS,
            TCP_TABLE_OWNER_MODULE_ALL
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_TCPTABLE_OWNER_PID
        {
            public uint dwNumEntries;
            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
            public MIB_TCPROW_OWNER_PID[] table;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_TCP6TABLE_OWNER_PID
        {
            public uint dwNumEntries;
            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
            public MIB_TCP6ROW_OWNER_PID[] table;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_TCPROW_OWNER_PID
        {
            public uint state;
            public uint localAddr;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] localPort;
            public uint remoteAddr;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] remotePort;
            public uint owningPid;

            public uint ProcessId
            {
                get { return owningPid; }
            }

            public IPAddress LocalAddress
            {
                get { return new IPAddress(localAddr); }
            }

            public ushort LocalPort
            {
                get
                {
                    return BitConverter.ToUInt16(new byte[2] { localPort[1], localPort[0] }, 0);
                }
            }

            public IPAddress RemoteAddress
            {
                get { return new IPAddress(remoteAddr); }
            }

            public ushort RemotePort
            {
                get
                {
                    return BitConverter.ToUInt16(new byte[2] { remotePort[1], remotePort[0] }, 0);
                }
            }

            public MIB_TCP_STATE State
            {
                get { return (MIB_TCP_STATE)state; }
            }
        }


        [StructLayout(LayoutKind.Sequential)]
        public struct MIB_TCP6ROW_OWNER_PID
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            public byte[] localAddr;
            public uint localScopeId;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] localPort;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
            public byte[] remoteAddr;
            public uint remoteScopeId;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] remotePort;
            public uint state;
            public uint owningPid;

            public uint ProcessId
            {
                get { return owningPid; }
            }

            public long LocalScopeId
            {
                get { return localScopeId; }
            }

            public IPAddress LocalAddress
            {
                get { return new IPAddress(localAddr, LocalScopeId); }
            }

            public ushort LocalPort
            {
                get { return BitConverter.ToUInt16(localPort.Take(2).Reverse().ToArray(), 0); }
            }

            public long RemoteScopeId
            {
                get { return remoteScopeId; }
            }

            public IPAddress RemoteAddress
            {
                get { return new IPAddress(remoteAddr, RemoteScopeId); }
            }

            public ushort RemotePort
            {
                get { return BitConverter.ToUInt16(remotePort.Take(2).Reverse().ToArray(), 0); }
            }

            public MIB_TCP_STATE State
            {
                get { return (MIB_TCP_STATE)state; }
            }
        }


        public const int AF_INET = 2;    // IP_v4 = System.Net.Sockets.AddressFamily.InterNetwork
        public const int AF_INET6 = 23;  // IP_v6 = System.Net.Sockets.AddressFamily.InterNetworkV6

        public static Task<List<MIB_TCPROW_OWNER_PID>> GetAllTCPConnectionsAsync()
        {
            return Task.Run(() => GetTCPConnections<MIB_TCPROW_OWNER_PID, MIB_TCPTABLE_OWNER_PID>(AF_INET));
        }

        public static List<MIB_TCPROW_OWNER_PID> GetAllTCPConnections()
        {
            return GetTCPConnections<MIB_TCPROW_OWNER_PID, MIB_TCPTABLE_OWNER_PID>(AF_INET);
        }

        public static Task<List<MIB_TCP6ROW_OWNER_PID>> GetAllTCPv6ConnectionsAsync()
        {
            return Task.Run(()=>GetTCPConnections<MIB_TCP6ROW_OWNER_PID, MIB_TCP6TABLE_OWNER_PID>(AF_INET6));
        }

        public static List<MIB_TCP6ROW_OWNER_PID> GetAllTCPv6Connections()
        {
            return GetTCPConnections<MIB_TCP6ROW_OWNER_PID, MIB_TCP6TABLE_OWNER_PID>(AF_INET6);
        }

        private static List<IPR> GetTCPConnections<IPR, IPT>(int ipVersion)//IPR = Row Type, IPT = Table Type
        {
            List<IPR> result = null;

            IPR[] tableRows = null;
            int buffSize = 0;

            var dwNumEntriesField = typeof(IPT).GetField("dwNumEntries");

            // how much memory do we need?
            uint ret = GetExtendedTcpTable(IntPtr.Zero, ref buffSize, true, ipVersion, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL);
            IntPtr tcpTablePtr = Marshal.AllocHGlobal(buffSize);

            try
            {
                ret = GetExtendedTcpTable(tcpTablePtr, ref buffSize, true, ipVersion, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL);
                if (ret != 0)
                    return new List<IPR>();

                // get the number of entries in the table
                IPT table = (IPT)Marshal.PtrToStructure(tcpTablePtr, typeof(IPT));
                int rowStructSize = Marshal.SizeOf(typeof(IPR));
                uint numEntries = (uint)dwNumEntriesField.GetValue(table);

                // buffer we will be returning
                tableRows = new IPR[numEntries];

                IntPtr rowPtr = (IntPtr)((long)tcpTablePtr + 4);
                for (int i = 0; i < numEntries; i++)
                {
                    IPR tcpRow = (IPR)Marshal.PtrToStructure(rowPtr, typeof(IPR));
                    tableRows[i] = tcpRow;
                    rowPtr = (IntPtr)((long)rowPtr + rowStructSize);   // next entry
                }
            }
            finally
            {
                result = tableRows?.ToList() ?? new List<IPR>();

                // Free the Memory
                Marshal.FreeHGlobal(tcpTablePtr);
            }

            return result;
        }

        public static string GetTcpStateName(MIB_TCP_STATE state)
        {
            switch (state)
            {
                case MIB_TCP_STATE.MIB_TCP_STATE_CLOSED:
                    return "Closed";
                case MIB_TCP_STATE.MIB_TCP_STATE_LISTEN:
                    return "Listen";
                case MIB_TCP_STATE.MIB_TCP_STATE_SYN_SENT:
                    return "SynSent";
                case MIB_TCP_STATE.MIB_TCP_STATE_SYN_RCVD:
                    return "SynReceived";
                case MIB_TCP_STATE.MIB_TCP_STATE_ESTAB:
                    return "Established";
                case MIB_TCP_STATE.MIB_TCP_STATE_FIN_WAIT1:
                    return "FinWait 1";
                case MIB_TCP_STATE.MIB_TCP_STATE_FIN_WAIT2:
                    return "FinWait 2";
                case MIB_TCP_STATE.MIB_TCP_STATE_CLOSE_WAIT:
                    return "CloseWait";
                case MIB_TCP_STATE.MIB_TCP_STATE_CLOSING:
                    return "Closing";
                case MIB_TCP_STATE.MIB_TCP_STATE_LAST_ACK:
                    return "LastAck";
                case MIB_TCP_STATE.MIB_TCP_STATE_TIME_WAIT:
                    return "TimeWait";
                case MIB_TCP_STATE.MIB_TCP_STATE_DELETE_TCB:
                    return "DeleteTCB";
                default:
                    return ((int)state).ToString();
            }
        }

        private static readonly ConcurrentDictionary<string, string> DicOfIpToHostName = new ConcurrentDictionary<string, string>();

        public const string UnknownHostName = "Unknown";

        // ******************************************************************
        public static string GetHostName(IPAddress ipAddress)
        {
            return GetHostName(ipAddress.ToString());
        }

        // ******************************************************************
        public static string GetHostName(string ipAddress)
        {
            string hostName = null;

            if (!DicOfIpToHostName.TryGetValue(ipAddress, out hostName))
            {
                try
                {
                    if (ipAddress == "0.0.0.0" || ipAddress == "::")
                    {
                        hostName = ipAddress;
                    }
                    else
                    {
                        hostName = Dns.GetHostEntry(ipAddress).HostName;
                    }
                }
                catch (Exception ex)
                {
                    Debug.Print(ex.ToString());
                    hostName = UnknownHostName;
                }

                DicOfIpToHostName[ipAddress] = hostName;
            }

            return hostName;
        }

        // ************************************************************************
        /// <summary>
        /// Will search for the an active NetworkInterafce that has a Gateway, otherwise
        /// it will fallback to try from the DNS which is not safe.
        /// </summary>
        /// <returns></returns>
        public static NetworkInterface GetMainNetworkInterface()
        {
            List<NetworkInterface> candidates = new List<NetworkInterface>();

            if (NetworkInterface.GetIsNetworkAvailable())
            {
                NetworkInterface[] NetworkInterfaces =
                    NetworkInterface.GetAllNetworkInterfaces();

                foreach (
                    NetworkInterface ni in NetworkInterfaces)
                {
                    if (ni.OperationalStatus == OperationalStatus.Up)
                        candidates.Add(ni);
                }
            }

            if (candidates.Count == 1)
            {
                return candidates[0];
            }

            // Accoring to our tech, the main NetworkInterface should have a Gateway 
            // and it should be the ony one with a gateway.
            if (candidates.Count > 1)
            {
                for (int n = candidates.Count - 1; n >= 0; n--)
                {
                    if (candidates[n].GetIPProperties().GatewayAddresses.Count == 0)
                    {
                        candidates.RemoveAt(n);
                    }
                }

                if (candidates.Count == 1)
                {
                    return candidates[0];
                }
            }

            // Fallback to try by getting my ipAdress from the dns
            IPAddress myMainIpAdress = null;
            IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
            foreach (IPAddress ip in host.AddressList)
            {
                if (ip.AddressFamily == AddressFamily.InterNetwork) // Get the first IpV4
                {
                    myMainIpAdress = ip;
                    break;
                }
            }

            if (myMainIpAdress != null)
            {
                NetworkInterface[] NetworkInterfaces =
                    NetworkInterface.GetAllNetworkInterfaces();

                foreach (NetworkInterface ni in NetworkInterfaces)
                {
                    if (ni.OperationalStatus == OperationalStatus.Up)
                    {
                        IPInterfaceProperties props = ni.GetIPProperties();
                        foreach (UnicastIPAddressInformation ai in props.UnicastAddresses)
                        {
                            if (ai.Address.Equals(myMainIpAdress))
                            {
                                return ni;
                            }
                        }
                    }
                }
            }

            return null;
        }

        // ******************************************************************
        /// <summary>
        /// AddressFamily.InterNetwork = IPv4
        /// Thanks to Dr. Wilys Apprentice at
        /// http://stackoverflow.com/questions/1069103/how-to-get-the-ip-address-of-the-server-on-which-my-c-sharp-application-is-runni
        /// using System.Net.NetworkInformation;
        /// </summary>
        /// <param name="mac"></param>
        /// <param name="addressFamily">AddressFamily.InterNetwork = IPv4,  AddressFamily.InterNetworkV6 = IPv6</param>
        /// <returns></returns>
        public static IPAddress GetIpFromMac(PhysicalAddress mac, AddressFamily addressFamily = AddressFamily.InterNetwork)
        {
            NetworkInterface[] NetworkInterfaces =
                NetworkInterface.GetAllNetworkInterfaces();

            foreach (NetworkInterface ni in NetworkInterfaces)
            {
                if (ni.GetPhysicalAddress().Equals(mac))
                {
                    if (ni.OperationalStatus == OperationalStatus.Up)
                    {
                        IPInterfaceProperties props = ni.GetIPProperties();
                        foreach (UnicastIPAddressInformation ai in props.UnicastAddresses)
                        {
                            if (ai.DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred)
                            {
                                if (ai.Address.AddressFamily == addressFamily)
                                {
                                    return ai.Address;
                                }
                            }
                        }
                    }
                }
            }

            return null;
        }

        // ******************************************************************
        /// <summary>
        /// Return the best guess of main ipAdress. To get it in the form aaa.bbb.ccc.ddd just call 
        /// '?.ToString() ?? ""' on the result.
        /// </summary>
        /// <returns></returns>
        public static IPAddress GetMyInternetIpAddress()
        {
            NetworkInterface ni = GetMainNetworkInterface();
            IPAddress ipAddress = GetIpFromMac(ni.GetPhysicalAddress());
            if (ipAddress == null) // could it be possible ?
            {
                ipAddress = GetIpFromMac(ni.GetPhysicalAddress(), AddressFamily.InterNetworkV6);
            }

            return ipAddress;
        }

        // ******************************************************************
        public static bool IsBroadcastAddress(IPAddress ipAddress)
        {
            if (ipAddress.AddressFamily == AddressFamily.InterNetwork)
            {
                return ipAddress.GetAddressBytes()[3] == 255;
            }

            if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6)
            {
                return false; // NO broadcast in IPv6
            }

            return false;
        }

        // ******************************************************************
        public static bool IsMulticastAddress(IPAddress ipAddress)
        {
            if (ipAddress.AddressFamily == AddressFamily.InterNetwork)
            {
                // Source: https://technet.microsoft.com/en-us/library/cc772041(v=ws.10).aspx
                return ipAddress.GetAddressBytes()[0] >= 224 && ipAddress.GetAddressBytes()[0] <= 239;
            }

            if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6)
            {
                return ipAddress.IsIPv6Multicast;
            }

            return false;
        }

        // ******************************************************************

    }
}

1

আপনার সর্বজনীন আইপি ঠিকানা পাওয়ার আরেকটি উপায় হ'ল অনুরোধ হিসাবে ওপেনডিএনএসের resolve1.opendns.comসার্ভারটি ব্যবহার করা myip.opendns.com

কমান্ড লাইনে এটি হ'ল:

  nslookup myip.opendns.com resolver1.opendns.com

অথবা সি # তে DNSClient নুগেট ব্যবহার করে:

  var lookup = new LookupClient(new IPAddress(new byte[] { 208, 67, 222, 222 }));
  var result = lookup.Query("myip.opendns.com", QueryType.ANY);

এটি HTTP এন্ডপয়েন্টগুলিকে আঘাত করা এবং প্রতিক্রিয়াগুলি পার্স করার চেয়ে কিছুটা পরিষ্কার।


0

এবং এটি ভিবি.এনইটি-তে সিএসভি ফর্ম্যাটে সমস্ত স্থানীয় আইপি পেতে

Imports System.Net
Imports System.Net.Sockets

Function GetIPAddress() As String
    Dim ipList As List(Of String) = New List(Of String)
    Dim host As IPHostEntry
    Dim localIP As String = "?"
    host = Dns.GetHostEntry(Dns.GetHostName())
    For Each ip As IPAddress In host.AddressList
        If ip.AddressFamily = AddressFamily.InterNetwork Then
            localIP = ip.ToString()
            ipList.Add(localIP)
        End If
    Next
    Dim ret As String = String.Join(",", ipList.ToArray)
    Return ret
End Function

0

দূরবর্তী আইপি ঠিকানাটি দ্রুততম উপায় পেতে way আপনাকে অবশ্যই ডাউনলোডার ব্যবহার করতে হবে, বা আপনার কম্পিউটারে একটি সার্ভার তৈরি করতে হবে।

এই সাধারণ কোডটি ব্যবহার করার জন্য ডাউনসাইডস: (যা প্রস্তাবিত) এটি হ'ল আপনার রিমোট আইপি ঠিকানা পেতে 3-5 সেকেন্ড সময় লাগবে কারণ ওয়েবক্লিয়েন্ট যখন আপনার প্রক্সি সেটিংস চেক করতে সর্বদা 3-5 সেকেন্ড সময় নেয়।

 public static string GetIP()
 {
            string externalIP = "";
            externalIP = new WebClient().DownloadString("http://checkip.dyndns.org/");
            externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"))
                                           .Matches(externalIP)[0].ToString();
            return externalIP;
 }

এটি আমি এখানে স্থির করেছি কীভাবে .. (প্রথম বার এখনও 3-5 সেকেন্ড সময় নেয়) তবে এর পরে এটি সর্বদা আপনার সংযোগের উপর নির্ভর করে আপনার দূরবর্তী আইপি ঠিকানা 0-2 সেকেন্ডের মধ্যে পেয়ে যাবে।

public static WebClient webclient = new WebClient();
public static string GetIP()
{
    string externalIP = "";
    externalIP = webclient.DownloadString("http://checkip.dyndns.org/");
    externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"))
                                   .Matches(externalIP)[0].ToString();
    return externalIP;
}

ডাউনটা কেন? এরপরে আপনি কোনও উত্তর দ্রুত বা এর চেয়ে ভাল আর খুঁজে পেতে পারেন না every
এসএসপোকে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.