স্থানীয় আইপি ঠিকানা পান


301

ইন্টারনেটে এমন বেশ কয়েকটি জায়গা রয়েছে যা আপনাকে দেখায় যে কীভাবে আইপি ঠিকানা পাবেন। এবং তাদের মধ্যে অনেকগুলি উদাহরণের মতো দেখায়:

String strHostName = string.Empty;
// 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);
// 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());
}
Console.ReadLine();

এই উদাহরণের সাথে আমি বেশ কয়েকটি আইপি অ্যাড্রেস পেয়েছি, তবে আমি কেবল রাউটারটি প্রোগ্রাম চালাচ্ছিল কম্পিউটারকে যে একটি নির্দিষ্ট করে তা পেতে আগ্রহী: আইপি যদি তিনি আমার কম্পিউটারে একটি ভাগ করা ফোল্ডার অ্যাক্সেস করতে চান তবে আমি কাউকে দেব IP দৃষ্টান্ত.

যদি আমি কোনও নেটওয়ার্কের সাথে সংযুক্ত না হয়ে থাকি এবং আমি কোনও রাউটার ছাড়াই একটি মডেমের মাধ্যমে সরাসরি ইন্টারনেটে সংযুক্ত থাকি তবে আমি একটি ত্রুটি পেতে চাই। আমার কম্পিউটারটি সি # এর সাথে কোনও নেটওয়ার্কের সাথে সংযুক্ত আছে কিনা তা ল্যান আইপি ঠিকানা পাওয়ার পরে কীভাবে দেখতে পাব।


If I am not connected to a network and I am connected to the internet এই বিবৃতিটি পরস্পরবিরোধী বলে মনে হচ্ছে। আপনার কম্পিউটারটি কোনও প্রাইভেট ল্যান বা ইন্টারনেটের সাথে সংযুক্ত আছে কিনা তা বোঝার চেষ্টা করছেন?
অ্যান্ডি

4
ঠিক একটি সতর্কতা হিসাবে: একটি কম্পিউটারে একাধিক আইপি ইন্টারফেস থাকতে পারে, উদাহরণস্বরূপ ল্যান এবং ওয়াইফাই। যদি আপনি কোনও নির্দিষ্ট হার্ডওয়ারের একটি পরিষেবা আবদ্ধ করেন (ল্যান বলুন), আপনার ল্যানের আইপি দরকার। নিম্নলিখিত উদাহরণগুলির বেশিরভাগটি "প্রথম" বা "শেষ" আইপি ঠিকানাটি পেয়ে যাবে। আপনার যদি ২ টিরও বেশি আইপি ঠিকানা থাকে তবে ওএস আইপি অ্যাড্রেসগুলি এলোমেলো আদেশের উপর নির্ভর করে আপনার প্রোগ্রামে 50% সময় কাজ করতে পারে।
লাকাতা

@ মার্কলকাতা আমি একই সমস্যাটি নিয়ে ভাবলাম। আমার উত্তরের নীচের ফাংশনটি এটি পরিচালনা করবে। আপনি কোন ধরণের নেটওয়ার্ক ইন্টারফেসের আইপি ঠিকানা চান তা নির্দিষ্ট করতে পারেন।
compman2408

3
শুধু FTR, আপনি যদি এখানে Unity3D জন্য Google, এটা Network.player.ipAddress তাদের এপিআই এর
Fattie

@ মার্কলাকাতা কঠোরভাবে বলতে গেলে, "প্রথম" বা "শেষ" আইপি হ'ল "সঠিক" আইপি, কারণ ব্রাউজারটি যে কোনও আইপি উপলভ্য হতে পারে use সম্ভবত একটি ভাল সংশোধন করা উচিত মেশিনের সাথে যুক্ত প্রতিটি আইপি ফিরে ।
আনকাএলবি

উত্তর:


457

স্থানীয় আইপি ঠিকানা পেতে:

public static string GetLocalIPAddress()
{
    var host = Dns.GetHostEntry(Dns.GetHostName());
    foreach (var ip in host.AddressList)
    {
        if (ip.AddressFamily == AddressFamily.InterNetwork)
        {
            return ip.ToString();
        }
    }
    throw new Exception("No network adapters with an IPv4 address in the system!");
}

আপনি সংযুক্ত আছেন কি না তা পরীক্ষা করতে:

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();


29
আপনি ভিএম ভার্চুয়াল বক্স, জিনমোশন ইত্যাদির মতো স্টাফ ব্যবহার করলে চলবে না
পলেফেক্ট

5
পলএফেক্টের সাথে সম্মত হন। একাধিক নেটওয়ার্ক কার্ডের জন্যই কেবল এই পদ্ধতিটি খারাপ নয়, এটি আইপি ভি 6 এবং আইপি ভি 4 অ্যাড্রেসের মধ্যে পার্থক্যও করে না।
সর্বোচ্চ

16
@ জন এড্রেসফ্যামিলি.আইনটারনেট ওয়ার্কটি আইপি ভি 4 এবং অ্যাড্রেসফ্যামিলি.আইনটারনেট ওয়ার্ক ভি 6 আইপি ভি 6
লিওনার্দো জাভেয়ার

আমি জেরাল্ডো এইচ উত্তর ব্যবহার করছি, তবে যদি কেউ এটি ব্যবহার করে তবে আপনি 1 দিয়ে শেষ হওয়া সমস্ত আইপিগুলি সরিয়ে ফেলতে চাইতে পারেন, তাই এটি লুপব্যাক এবং ভার্চুয়ালবক্স / ভিএমওয়্যার ডিফল্ট আইপস সরিয়ে ফেলবে
লিওনার্দো জাভিয়ার

6
দেখে মনে হচ্ছে আপনি ভিএমওয়্যার বা অন্যান্য ভার্চুয়ালাইজেশন সফ্টওয়্যার ব্যবহার করছেন। ওপি এর জন্য জিজ্ঞাসা করেনি, তাই আমি মনে করি যে এর কারণে ভোট দেওয়া কিছুটা কঠোর। আপনার যদি ভিএমওয়্যার বা একাধিক এনআইসি থাকে তবে অন্যান্য উত্তরগুলির মধ্যে ইতিমধ্যে এটির জন্য একটি ক্লু সরবরাহ করে।
মিঃচিফ 31'16

218

স্থানীয় মেশিনে মাল্টি আইপি অ্যাড্রেস পাওয়া গেলে আরও সঠিক উপায় থাকে। Connectএকটি ইউডিপি সকেট এবং এর স্থানীয় শেষ পয়েন্টটি পড়ুন:

string localIP;
using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0))
{
    socket.Connect("8.8.8.8", 65530);
    IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint;
    localIP = endPoint.Address.ToString();
}

Connectএকটি ইউডিপি সকেটের উপর নিম্নলিখিত প্রভাব রয়েছে: এটি Send/ এর জন্য গন্তব্য নির্ধারণ করে Recv, অন্যান্য ঠিকানা থেকে সমস্ত প্যাকেট বিছিন্ন করে এবং - যা আমরা ব্যবহার করি - সকেটটিকে "সংযুক্ত" অবস্থায় স্থানান্তর করে তার উপযুক্ত ক্ষেত্রগুলি সেট করে। এর মধ্যে রয়েছে সিস্টেমের রাউটিং টেবিল অনুসারে গন্তব্যের পথে রুটের অস্তিত্ব পরীক্ষা করা এবং সেই অনুযায়ী স্থানীয় শেষ পয়েন্টটি নির্ধারণ করা। শেষ অংশটি আনুষ্ঠানিকভাবে আনুষ্ঠানিকভাবে বলে মনে হচ্ছে তবে এটি বার্কলে সকেটস এপিআইয়ের একটি অবিচ্ছেদ্য বৈশিষ্ট্যের মতো (ইউডিপি "সংযুক্ত" রাষ্ট্রের একটি পার্শ্ব প্রতিক্রিয়া) যা সংস্করণ এবং বিতরণ জুড়ে উইন্ডোজ এবং লিনাক্স উভয় ক্ষেত্রে নির্ভরযোগ্যভাবে কাজ করে ।

সুতরাং, এই পদ্ধতিটি স্থানীয় ঠিকানা দেবে যা নির্দিষ্ট দূরবর্তী হোস্টের সাথে সংযোগ করতে ব্যবহৃত হবে। সত্যিকারের সংযোগ স্থাপন করা হয়নি, সুতরাং নির্দিষ্ট দূরবর্তী আইপিটি অ্যাক্সেসযোগ্য হতে পারে।


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

10
কোনও নেটওয়ার্ক সংযোগ ছাড়াই - আপনার কোনও আইপি ঠিকানা নেই, কোনওভাবেই। সুতরাং কোডটি এখনও বৈধ হিসাবে ধরে রেখেছে, যদিও এটির চেষ্টাটি যুক্ত করা বুদ্ধিমানের কাজ হবে such
রাশ

2
পেট্রিকস্টিল, হ্যাঁ, এটি নির্দিষ্ট টার্গেটের জন্য পছন্দসই আউটবাউন্ড আইপি ঠিকানা প্রদান করে। আপনি যদি আপনার ল্যান আইপি ঠিকানা পেতে চান তবে আপনার ল্যান থেকে কিছু আইপি হওয়ার লক্ষ্যটি নির্দেশ করার চেষ্টা করুন
নেক্সট ডোর থেকে

2
এই পদ্ধতিটি ডটনেট কোর সহ একটি ম্যাকের সাথে কাজ করে, যদিও গৃহীত উত্তর বর্তমানে তা করে না।
Pellet

9
এই সমাধানটি গৃহীত উত্তরের চেয়ে প্রায় 4 গুণ বেশি দ্রুত কাজ করে (মিস্টারফ দ্বারা) by এটি আসল উত্তর হওয়া উচিত
কামারে

115

লিনক (যেমন। নেট 3.0.০++) লাভের জন্য মিঃচিফের কোডটি রিফ্যাক্টরিং। ।

private IPAddress LocalIPAddress()
{
    if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
    {
        return null;
    }

    IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());

    return host
        .AddressList
        .FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);
}

:)


"ইন্টার নেটওয়ার্ক" হিসাবে আমি কয়েকটি আইপি অ্যাড্রেস পেয়েছি এই সমাধানটি আসলে কাজ করে এবং ডানটিকে ফিরে দেয়। মিস্টারফের অন্য একজন আমাকে শেষটি দিয়েছিলেন। সুতরাং প্রকৃতপক্ষে এইটি ঠিক হওয়া উচিত;)
কিনোনা ফ্লাফবল

26
@ কিনোরাফ্লফবল - এটি আপনাকে প্রথমটি দেয়, যেখানে এটি আপনাকে শেষটি দেয় (বা বিপরীতে, তালিকাটি কীভাবে নির্মিত হয় তা নির্ভর করে)। যে কোনও উপায়ে, উভয়ই ঠিক নয় - যদি আপনার কাছে 1 টিরও বেশি আইপি ঠিকানা দেওয়া থাকে তবে আপনি কোন নেটওয়ার্কটি ব্যবহার করছেন তা আপনাকে জানতে হবে। প্রথম বা শেষটি নিয়ে অনুমান করা সঠিক সমাধান নয়।
gbjbaanb

অ্যাড্রেসফ্যামিলিও অন্তর্ভুক্ত করতে চাই
I

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

109

আমি জানি এটি মৃত ঘোড়াটিকে লাথি মারছে, তবে সম্ভবত এটি কাউকে সহায়তা করতে পারে। আমি আমার স্থানীয় আইপি ঠিকানা সন্ধানের জন্য সমস্ত জায়গার দিকে তাকিয়েছি, তবে যেখানেই আমি এটি ব্যবহার করতে বলছি:

Dns.GetHostEntry(Dns.GetHostName());

আমি এটি মোটেও পছন্দ করি না কারণ এটি কেবল আপনার কম্পিউটারে নির্ধারিত সমস্ত ঠিকানা পায়। আপনার যদি একাধিক নেটওয়ার্ক ইন্টারফেস থাকে (যা বেশিরভাগ কম্পিউটারই এখন-এক-দিন করে)) আপনার কোন ধারণা নেই কোন ঠিকানাটি কোন নেটওয়ার্ক ইন্টারফেসের সাথে চলে। একগুচ্ছ গবেষণা করার পরে আমি নেটওয়ার্কআইন্টারফেস ক্লাসটি ব্যবহার করার জন্য একটি ফাংশন তৈরি করেছি এবং এর মধ্যে তথ্যটি ঝাঁকিয়েছি। এই উপায়টি আমি বলতে পারি এটি কী ধরণের ইন্টারফেস, (ইথারনেট, ওয়্যারলেস, লুপব্যাক, টানেল ইত্যাদি), এটি সক্রিয় রয়েছে কি না, এবং আরও অনেক কিছু OO

public string GetLocalIPv4(NetworkInterfaceType _type)
{
    string output = "";
    foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
    {
        if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
        {
            foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
            {
                if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
                {
                    output = ip.Address.ToString();
                }
            }
        }
    }
    return output;
}

এখন আপনার ইথারনেট নেটওয়ার্ক ইন্টারফেস কলের IPv4 ঠিকানা পেতে:

GetLocalIPv4(NetworkInterfaceType.Ethernet);

বা আপনার ওয়্যারলেস ইন্টারফেস:

GetLocalIPv4(NetworkInterfaceType.Wireless80211);

যদি আপনি একটি ওয়্যারলেস ইন্টারফেসের জন্য আইপিভি 4 ঠিকানা পাওয়ার চেষ্টা করেন তবে আপনার কম্পিউটারে একটি ওয়্যারলেস কার্ড ইনস্টল করা নেই এটি কেবল একটি খালি স্ট্রিং ফিরিয়ে দেবে। ইথারনেট ইন্টারফেসের সাথে একই জিনিস।

আশা করি এটি কাউকে সাহায্য করবে! :-)

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

এটি চিহ্নিত করা হয়েছিল (ধন্যবাদ @ নাসবানোভ) যদিও এই ফাংশনটি আইপি অ্যাড্রেসটি ব্যবহার Dns.GetHostEntry(Dns.GetHostName())করার চেয়ে অনেক ভাল উপায়ে বের করার বিষয়ে যায় তবে এটি একই ধরণের একাধিক ইন্টারফেস বা একাধিক আইপি অ্যাড্রেসকে একক ইন্টারফেসে সমর্থন করে না very । যখন কেবল একাধিক ঠিকানা বরাদ্দ থাকতে পারে তবে এটি কেবলমাত্র একক আইপি ঠিকানা প্রদান করবে। এই নির্ধারিত সমস্ত ঠিকানাগুলিতে ফিরে আসার জন্য আপনি কেবলমাত্র একটি একক স্ট্রিংয়ের পরিবর্তে একটি অ্যারে ফেরত দিতে মূল ফাংশনটি পরিচালনা করতে পারেন। উদাহরণ স্বরূপ:

public static string[] GetAllLocalIPv4(NetworkInterfaceType _type)
{
    List<string> ipAddrList = new List<string>();
    foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
    {
        if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
        {
            foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
            {
                if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
                {
                    ipAddrList.Add(ip.Address.ToString());
                }
            }
        }
    }
    return ipAddrList.ToArray();
}

এখন এই ফাংশনটি একটি নির্দিষ্ট ইন্টারফেস ধরণের জন্য সমস্ত নির্ধারিত ঠিকানা ফেরত দেবে। এখন কেবল একটি একক স্ট্রিং পেতে আপনি .FirstOrDefault()এক্সটেনশানটি অ্যারেতে প্রথম আইটেমটি ফেরত দিতে বা এটি খালি থাকলে খালি স্ট্রিংটি ফিরে আসতে পারেন।

GetLocalIPv4(NetworkInterfaceType.Ethernet).FirstOrDefault();

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

এটির সাথে সমস্যাটি হ'ল আপনি কেবল ইন্টারফেসের জন্য 1 টি আইপি ঠিকানা ফিরিয়ে দেন ... শেষ আইপি, পূর্বাভাস।
নাস বনভ

@ compman2408 - সত্য নয়, একটি একক ইন্টারফেস একাধিক আইপিগুলি থাকতে পারে, দেখতে en.wikipedia.org/wiki/Multihoming#Variants সব combos, জন্য। স্পষ্ট উদাহরণটি হ'ল আইপিভি 4 এবং আইপিভি 6 উভয়ই চালানো হলেও অতীতে আমার একক ইথারনেট অ্যাডাপ্টার একাধিক আইপিভি 4 নেটওয়ার্কে অংশ নিয়েছিল। অস্বাভাবিক হতে পারে - এখনও পুরোপুরি আইনী। Windows এর জন্য যেমন দেখতে windowsnetworking.com/articles-tutorials/windows-2003/...
নাস Banov

@ নাসবানভ এই ফাংশনটি কেবল আইপিভি 4 অ্যাড্রেস পাওয়ার জন্য সেট আপ করা হয়েছে যাতে আমি আইপিভি 6 এবং এর বর্তমান অদম্যতা সম্পর্কেও কথা বলি না। মাল্টিহোমিং সম্পর্কে আমি একাধিক ইন্টারফেসে একাধিক নেটওয়ার্কের সাথে সংযোগ স্থাপনের বিষয়ে সচেতন, তবে একই ইন্টারফেসে একাধিক নেটওয়ার্কের সাথে সংযোগ করার কথা কখনও শুনেনি। যদিও এটি আপনার পক্ষে সঠিক বলে মনে হচ্ছে এটি আসলেই সম্ভব, তবুও <1% লোক তাদের এনআইসি ব্যবহার করছে কেবল পরিবর্তে একটি অ্যারে ফিরিয়ে ফাংশন পরিবর্তন করতে হবে।
compman2408

1
এই জন্য আপনাকে ধন্যবাদ. কমপক্ষে FYI, ওএসএক্স .NET 3.5 মোনো item.OperationalStatusসর্বদা ফিরে আসে Unknown
gman

36

এখানে একটি পরিবর্তিত সংস্করণ রয়েছে (কমপ্যান্ট ৪৪০৮ এর একটি থেকে) যা আমার পক্ষে কাজ করেছে:

    internal static string GetLocalIPv4(NetworkInterfaceType _type)
    {  // Checks your IP adress from the local network connected to a gateway. This to avoid issues with double network cards
        string output = "";  // default output
        foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces()) // Iterate over each network interface
        {  // Find the network interface which has been provided in the arguments, break the loop if found
            if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
            {   // Fetch the properties of this adapter
                IPInterfaceProperties adapterProperties = item.GetIPProperties();
                // Check if the gateway adress exist, if not its most likley a virtual network or smth
                if (adapterProperties.GatewayAddresses.FirstOrDefault() != null)
                {   // Iterate over each available unicast adresses
                    foreach (UnicastIPAddressInformation ip in adapterProperties.UnicastAddresses)
                    {   // If the IP is a local IPv4 adress
                        if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                        {   // we got a match!
                            output = ip.Address.ToString();
                            break;  // break the loop!!
                        }
                    }
                }
            }
            // Check if we got a result if so break this method
            if (output != "") { break; }
        }
        // Return results
        return output;
    }

আপনি এই পদ্ধতিটি উদাহরণস্বরূপ কল করতে পারেন:

GetLocalIPv4(NetworkInterfaceType.Ethernet);

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


2
চতুর সমাধান। আমি এখন এটি ব্যবহার করছি।
আরকিউকিউ

4
কোড থেকে উদ্ভূত কোডের মতো একই সমস্যা রয়েছে: এটি কেবলমাত্র একটি আইপি, অনেকের থেকে একটি এলোমেলো আইপি ফেরত দেয় - যা আপনার প্রয়োজনের মতো হতে হবে না। এটি অ্যাডিমিলার
নাস বানভ

1
@ নাসবানভ, অবশ্যই আমি এটি উপার্জন করেছি, যেমনটি আমি আমার পোস্টে উল্লেখ করছি: "যা আমার পক্ষে কাজ করেছিল"। :-)
জেরার্ডো এইচ

এটি যাবার উপায়, এর জন্য আপনাকে ধন্যবাদ। যখন আপনি এমুলেটর ইনস্টল করার জন্য লুপ ব্যাক সুইচগুলি ইনস্টল করবেন, এটি সফল হওয়ার সাথে সাথে অন্যান্য সমস্ত রূপগুলি ব্যর্থ হয়!
ডায়মন্ডড্রাক

1
আপনি কেন কেবল সর্বশেষ আইপি-ঠিকানাটি খুঁজে পেয়েছেন, প্রথমটি নয়? breakসবচেয়ে অভ্যন্তরীণ মধ্যে একটি সাধারণ ifবা একটি returnকৌশল করতে হবে।
মার্টিন মুল্ডার

20

ভিএমওয়্যার হোস্ট বা অন্যান্য অবৈধ আইপি ঠিকানা এড়িয়ে চলমান আইপি পেতে আমি খুঁজে পেয়েছি এটি সেরা কোড।

public string GetLocalIpAddress()
{
    UnicastIPAddressInformation mostSuitableIp = null;

    var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

    foreach (var network in networkInterfaces)
    {
        if (network.OperationalStatus != OperationalStatus.Up)
            continue;

        var properties = network.GetIPProperties();

        if (properties.GatewayAddresses.Count == 0)
            continue;

        foreach (var address in properties.UnicastAddresses)
        {
            if (address.Address.AddressFamily != AddressFamily.InterNetwork)
                continue;

            if (IPAddress.IsLoopback(address.Address))
                continue;

            if (!address.IsDnsEligible)
            {
                if (mostSuitableIp == null)
                    mostSuitableIp = address;
                continue;
            }

            // The best IP is the IP got from DHCP server
            if (address.PrefixOrigin != PrefixOrigin.Dhcp)
            {
                if (mostSuitableIp == null || !mostSuitableIp.IsDnsEligible)
                    mostSuitableIp = address;
                continue;
            }

            return address.Address.ToString();
        }
    }

    return mostSuitableIp != null 
        ? mostSuitableIp.Address.ToString()
        : "";
}

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

অন্যান্য উপায়গুলি IsDnsEl اهل এবং উপসর্গআরগিন বৈধতা ব্যবহার করে না।
rodcesar.santos

@ ফিলিপএম যদি ঠিকানাটি কোনও ডিএনএস যোগ্য না হয় তবে এটি একটি সংরক্ষিত অভ্যন্তরীণ আইপি। এটি ইন্টারনেট সরবরাহকারী হোস্ট নয়। এবং যদি প্রিফিক্সআরগিন কোনও ডিএইচসিপি সার্ভার দ্বারা সরবরাহ করা হয় তবে এটি সম্ভবত সেরা ঠিকানা পছন্দ। এটি আমার জন্য কাজ করে এমন অনন্য কাজ!
rodcesar.santos

1
@ ব্যবহারকারী 1551843 - এটি দুর্দান্ত ছিল, ধন্যবাদ। আমি পুরানো অবজ্ঞাত গেটহস্টবাইনেম পদ্ধতিটি ব্যবহার করছিলাম তবে এটি কোনও ভিএমওয়্যার অ্যাডাপ্টারের আইপি ফিরিয়ে দিচ্ছিল :)
জেসন নিউল্যান্ড

ভিপিএন + ওয়্যারলেস এ এটিই আমার জন্য কাজ করেছিল। ধন্যবাদ.
জয়-বিপদ

12

আমার মনে হয় লিনকিউ ব্যবহার করা আরও সহজ:

Dns.GetHostEntry(Dns.GetHostName())
   .AddressList
   .First(x => x.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
   .ToString()

14
এটি লিনকুই নয়, এটি এক্সটেনশন পদ্ধতি এবং ল্যাম্বডাস। একটি পার্থক্য আছে।
চিহ্নিত করুন

10
@ মার্ক - আপনি যদি "সিস্টেম.লিনক ব্যবহার করে" যোগ না করেন; আপনি যদিও "প্রথম" এক্সটেনশন পদ্ধতিটি ব্যবহার করতে পারবেন না
বার্নটোকোড

5
এর কারণ হল এক্সটেনশন পদ্ধতিটি এনুম্যারেবল ক্লাসে রয়েছে যা সিস্টেমে রয়েছে in লিনক নেমস্পেসে। এটি এখনও লিনকিউ নয়।
চিহ্নিত করুন

20
চিহ্নিত করুন, এমনকি এই সংক্ষিপ্ত আকারে, বিবৃতিটি সত্যই পদ্ধতিতে (ল্যাম্বডা) সিনট্যাক্সের সাথে উপস্থাপিত LINQ-to-অবজেক্টগুলি ব্যবহার করছে। ক্যয়েরি সিনট্যাক্সটি কেবল সিনট্যাকটিক চিনি যা আইইনুমেবল এক্সটেনশন পদ্ধতি কলগুলির একটি শৃঙ্খলে সংকলিত হয়, যা লিনকু-টু-অবজেক্টগুলি। উত্স: একটি লিনকো-টু-এসকিউএল সরবরাহকারী এবং বিষয়টির উপর একটি ধারাবাহিক নিবন্ধ রচনা করেছেন।
ধ্রুবক g


9

হাসির জন্য, ভেবেছি আমি নতুন সি # 6 নাল-কন্ডিশনাল অপারেটরটি ব্যবহার করে একটি একক লিনিকিউ স্টেটমেন্ট পেয়েছি। দেখতে বেশ পাগল এবং সম্ভবত মারাত্মকভাবে অদক্ষ, তবে এটি কার্যকর।

private string GetLocalIPv4(NetworkInterfaceType type = NetworkInterfaceType.Ethernet)
{
    // Bastardized from: http://stackoverflow.com/a/28621250/2685650.

    return NetworkInterface
        .GetAllNetworkInterfaces()
        .FirstOrDefault(ni =>
            ni.NetworkInterfaceType == type
            && ni.OperationalStatus == OperationalStatus.Up
            && ni.GetIPProperties().GatewayAddresses.FirstOrDefault() != null
            && ni.GetIPProperties().UnicastAddresses.FirstOrDefault(ip => ip.Address.AddressFamily == AddressFamily.InterNetwork) != null
        )
        ?.GetIPProperties()
        .UnicastAddresses
        .FirstOrDefault(ip => ip.Address.AddressFamily == AddressFamily.InterNetwork)
        ?.Address
        ?.ToString()
        ?? string.Empty;
}

লজিক সৌজন্যে Gerardo H(এবং রেফারেন্স দ্বারা compman2408)।


অবশ্যই মজাদার (+1), তবে আসলে একেবারেই অদক্ষ হওয়ার দরকার নেই। এলআইএসপি বা ফরথ :
রোল্যান্ড

6

লিনক এক্সপ্রেশন ব্যবহার করে আইপি পাওয়ার অন্যান্য উপায়:

public static List<string> GetAllLocalIPv4(NetworkInterfaceType type)
{
    return NetworkInterface.GetAllNetworkInterfaces()
                   .Where(x => x.NetworkInterfaceType == type && x.OperationalStatus == OperationalStatus.Up)
                   .SelectMany(x => x.GetIPProperties().UnicastAddresses)
                   .Where(x => x.Address.AddressFamily == AddressFamily.InterNetwork)
                   .Select(x => x.Address.ToString())
                   .ToList();
}

5

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

public static string localIPAddress()
{
    IPHostEntry host;
    string localIP = "";
    host = Dns.GetHostEntry(Dns.GetHostName());

    foreach (IPAddress ip in host.AddressList)
    {
        localIP = ip.ToString();

        string[] temp = localIP.Split('.');

        if (ip.AddressFamily == AddressFamily.InterNetwork && temp[0] == "192")
        {
            break;
        }
        else
        {
            localIP = null;
        }
    }

    return localIP;
}

2
আপনি কি লগমাইন হামচি? এটি একটি ভিপিএন সমাধান এবং এটি নেটওয়ার্ক স্ট্যাকের সাথে সংযোজন করে। এছাড়াও, ভিপিএন হওয়ার কারণে এটি যুক্তিসঙ্গত বলে মনে হয় যে এটি সংযুক্ত অবস্থায় ভিপিএন বরাদ্দকৃত আইপি ফিরিয়ে দেয় (কেবলমাত্র আমার অনুমান)।
মিচিফ

2
সম্পূর্ণ অবিশ্বাস্য। কেবলমাত্র 192.0.0.0/8একটি ব্যক্তিগত আইপি ঠিকানার জন্য সঠিক পরীক্ষা নয় (এখানে 3 টি ব্যাপ্তি রয়েছে, এটির চেয়ে সমস্ত পৃথক), এটি কর্পোরেট নেটওয়ার্ক পরিসীমা হতে পারে, তাই এত "স্থানীয়" নয়।
ivan_pozdeev

5

এক বা একাধিক ল্যান কার্ড এবং ভার্চুয়াল মেশিনের মাধ্যমে পরীক্ষিত

public static string DisplayIPAddresses()
    {
        string returnAddress = String.Empty;

        // Get a list of all network interfaces (usually one per network card, dialup, and VPN connection)
        NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

        foreach (NetworkInterface network in networkInterfaces)
        {
            // Read the IP configuration for each network
            IPInterfaceProperties properties = network.GetIPProperties();

            if (network.NetworkInterfaceType == NetworkInterfaceType.Ethernet &&
                   network.OperationalStatus == OperationalStatus.Up &&
                   !network.Description.ToLower().Contains("virtual") &&
                   !network.Description.ToLower().Contains("pseudo"))
            {
                // Each network interface may have multiple IP addresses
                foreach (IPAddressInformation address in properties.UnicastAddresses)
                {
                    // We're only interested in IPv4 addresses for now
                    if (address.Address.AddressFamily != AddressFamily.InterNetwork)
                        continue;

                    // Ignore loopback addresses (e.g., 127.0.0.1)
                    if (IPAddress.IsLoopback(address.Address))
                        continue;

                    returnAddress = address.Address.ToString();
                    Console.WriteLine(address.Address.ToString() + " (" + network.Name + " - " + network.Description + ")");
                }
            }
        }

       return returnAddress;
    }

মনে রাখবেন যে এটি কেবলমাত্র ইথারনেটের জন্য কাজ করছে। Wi-Fi সমর্থন করার জন্য নেটওয়ার্কআইন্টারফেস টাইপ সীমাবদ্ধতা সরান।
scor4er

3

লিনকিউ ব্যবহার করে আমার কেবল একটি আপডেট হওয়া সংস্করণ:

/// <summary>
/// Gets the local Ipv4.
/// </summary>
/// <returns>The local Ipv4.</returns>
/// <param name="networkInterfaceType">Network interface type.</param>
IPAddress GetLocalIPv4(NetworkInterfaceType networkInterfaceType)
{
    var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces().Where(i => i.NetworkInterfaceType == networkInterfaceType && i.OperationalStatus == OperationalStatus.Up);

    foreach (var networkInterface in networkInterfaces)
    {
        var adapterProperties = networkInterface.GetIPProperties();

        if (adapterProperties.GatewayAddresses.FirstOrDefault() == null)
                continue;
        foreach (var ip in networkInterface.GetIPProperties().UnicastAddresses)
        {
            if (ip.Address.AddressFamily != AddressFamily.InterNetwork)
                    continue;

            return ip.Address;
        }
    }

    return null;
}

2

প্রয়োজনীয় প্রয়োজনীয়তা: আপনাকে System.Data.Linq রেফারেন্স যুক্ত করতে হবে এবং এটি উল্লেখ করতে হবে

using System.Linq;
string ipAddress ="";
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
ipAddress = Convert.ToString(ipHostInfo.AddressList.FirstOrDefault(address => address.AddressFamily == AddressFamily.InterNetwork));

2

আমিও সঠিক আইপি পাওয়ার সাথে লড়াই করে যাচ্ছিলাম।

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

এটিই আমার পক্ষে কাজ করেছে, আশা করি এটি সাহায্য করবে ...

var firstAddress = (from address in NetworkInterface.GetAllNetworkInterfaces().Select(x => x.GetIPProperties()).SelectMany(x => x.UnicastAddresses).Select(x => x.Address)
                    where !IPAddress.IsLoopback(address) && address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork
                    select address).FirstOrDefault();

Console.WriteLine(firstAddress);


1

মনে রাখবেন, সাধারণ ক্ষেত্রে আপনার একাধিক NAT অনুবাদ চলতে পারে এবং একাধিক ডিএনএস সার্ভার, প্রতিটি আলাদা আলাদা NAT অনুবাদ স্তরে অপারেটিং থাকে।

আপনার যদি ক্যারিয়ার গ্রেড NAT থাকে এবং একই ক্যারিয়ারের অন্যান্য গ্রাহকদের সাথে যোগাযোগ করতে চান তবে কী হবে? সাধারণ ক্ষেত্রে আপনি কখনই নিশ্চিত হয়ে জানতে পারবেন না কারণ আপনি প্রতিটি NAT অনুবাদে বিভিন্ন হোস্টের নাম সহ উপস্থিত হতে পারেন।


1

অপ্রচলিত হয়ে গেছে, এটি আমার পক্ষে কাজ করে

public static IPAddress GetIPAddress()
{ 
 IPAddress ip = Dns.GetHostAddresses(Dns.GetHostName()).Where(address => 
 address.AddressFamily == AddressFamily.InterNetwork).First();
 return ip;
}

1

লিনকের সাথে মিঃচিফের উত্তর আপডেট করে আমাদের কাছে থাকবে:

public static IPAddress GetLocalIPAddress()
{
   var host = Dns.GetHostEntry(Dns.GetHostName());
   var ipAddress= host.AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);
   return ipAddress;
}

1

এটি আইপিভি 4 এবং আইপিভি 6, দুটি পৃথক তালিকায় গেটওয়ে ঠিকানা এবং ইউনিকাস্টের ঠিকানা রয়েছে এমন কোনও ইন্টারফেসের ঠিকানাগুলি ফেরত দেয়।

public static (List<IPAddress> V4, List<IPAddress> V6) GetLocal()
{
    List<IPAddress> foundV4 = new List<IPAddress>();
    List<IPAddress> foundV6 = new List<IPAddress>();

    NetworkInterface.GetAllNetworkInterfaces().ToList().ForEach(ni =>
    {
        if (ni.GetIPProperties().GatewayAddresses.FirstOrDefault() != null)
        {
            ni.GetIPProperties().UnicastAddresses.ToList().ForEach(ua =>
            {
                if (ua.Address.AddressFamily == AddressFamily.InterNetwork) foundV4.Add(ua.Address);
                if (ua.Address.AddressFamily == AddressFamily.InterNetworkV6) foundV6.Add(ua.Address);
            });
        }
    });

    return (foundV4.Distinct().ToList(), foundV6.Distinct().ToList());
}

ঝরঝরে সমাধান :)
জোহান ফ্রানজান

1

ইতিমধ্যে অনেক উত্তর আছে, কিন্তু আমি এখনও আমার একটি অবদান রাখছি:

public static IPAddress LocalIpAddress() {
    Func<IPAddress, bool> localIpPredicate = ip =>
        ip.AddressFamily == AddressFamily.InterNetwork &&
        ip.ToString().StartsWith("192.168"); //check only for 16-bit block
    return Dns.GetHostEntry(Dns.GetHostName()).AddressList.LastOrDefault(localIpPredicate);
}

এক রৈখিক:

public static IPAddress LocalIpAddress() => Dns.GetHostEntry(Dns.GetHostName()).AddressList.LastOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork && ip.ToString().StartsWith("192.168"));

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


1
সুতরাং আমার স্থানীয় আইপি যদি 10.0.2.3 হয় তবে এটি পাওয়া যায় না? এটি এই কোডটিতে সত্যই অদ্ভুত।
ফ্র্যাঙ্কহোমার্স 31:21 '

@ ফ্র্যাঙ্কহোমারদের বলা হয়েছে কেবল ১ 16-বিট ব্লকের জন্য চেক করুন
এনকনিং

16 বিট ব্লকগুলি 192.168
ফ্রেঞ্চহোমারের

0

ক্লায়েন্ট আইপি পাওয়ার জন্য কেবলমাত্র সহজ কোড:

        public static string getclientIP()
        {
            var HostIP = HttpContext.Current != null ? HttpContext.Current.Request.UserHostAddress : "";
            return HostIP;
        }

আশা করি এটি আপনাকে সাহায্য করবে


0
Dns.GetHostEntry(Dns.GetHostName()).AddressList[1].MapToIPv4() //returns 192.168.14.1

এখানে চিত্র বর্ণনা লিখুন


5
আপনার উত্তরে এটি ওপি-র ক্ষেত্রে কীভাবে কাজ করে এবং ভবিষ্যতের পাঠকদেরও তার বিবরণ থাকা উচিত।
রোনাক ধৃত

ভবিষ্যতের পাঠকদের জন্য আপনার উত্তরের একটি ব্যাখ্যা অন্তর্ভুক্ত করা ভাল।
নিকোলাস গ্রাভেইস

0

প্রতিটি মাধ্যমে পুনরাবৃত্তি করতে সক্ষম হতে compman2408 এর কোড সংশোধিত NetworkInterfaceType

public static string GetLocalIPv4 (NetworkInterfaceType _type) {
    string output = null;
    foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces ()) {
        if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up) {
            foreach (UnicastIPAddressInformation ip in item.GetIPProperties ().UnicastAddresses) {
                if (ip.Address.AddressFamily == AddressFamily.InterNetwork) {
                    output = ip.Address.ToString ();
                }
            }
        }
    }
    return output;
}

এবং আপনি এটিকে এভাবে কল করতে পারেন:

static void Main (string[] args) {
    // Get all possible enum values:
    var nitVals = Enum.GetValues (typeof (NetworkInterfaceType)).Cast<NetworkInterfaceType> ();

    foreach (var nitVal in nitVals) {
        Console.WriteLine ($"{nitVal} => {GetLocalIPv4 (nitVal) ?? "NULL"}");
    }
}

0
Imports System.Net
Imports System.Net.Sockets
Function LocalIP()
    Dim strHostName = Dns.GetHostName
    Dim Host = Dns.GetHostEntry(strHostName)
    For Each ip In Host.AddressList
        If ip.AddressFamily = AddressFamily.InterNetwork Then
            txtIP.Text = ip.ToString
        End If
    Next

    Return True
End Function

একই ক্রিয়া নীচে

ফাংশন লোকালআইপি ()

স্ট্রিং হিসাবে ডিমে হোস্ট = ডিএনএস.গেটহোস্টইন্ট্রি (ডিএনএস.গেটহোস্টনাম)। অ্যাড্রেসলিস্ট (1) .ম্যাপটোইভিভি 4

txtIP.Text = হোস্ট

সত্য ফিরে

ফাংশন শেষ


ভিজ্যুয়াল বেসিক .... ভাল কাজ করুন .. খুব ভাল
YongJae Kim

উদাহরণের নীচে একই ক্রিয়া ফাংশন লোকালআইপি () স্ট্রিং হিসাবে ডিম হোস্ট = ডিএনএস.গেটহোস্টেন্ট্রি (ডিএনএস.গেটহোস্টনেম) .এড্রেসলিস্ট (1) .ম্যাপটোইপিভি 4.টোস্ট্রিং txtIP.Text = হোস্ট রিটার্ন আসল ফাংশন
ইয়ংজে কিম

-2
Dns.GetHostEntry(Dns.GetHostName()).AddressList[1]

কোডের একটি লাইন: ডি


7
এটি কিছু ক্ষেত্রে একটি আউটআফ্র্যাঞ্জএক্সসেপশন ফেলে দিতে পারে।
লাউডেনভিয়ার

5
এছাড়াও, আপনি কীভাবে জানেন যে আপনি কোনটি চান? আপনার পক্ষে যা সঠিক তা অন্য কারও জন্য ভুল হতে পারে।
চিহ্নিত করুন

-3

আপনার যদি ভার্চুয়াল মেশিন বা অতিরিক্ত নেটওয়ার্ক কার্ড থাকে তবে ঠিকানা তালিকায় অন্য মান থাকতে পারে। আমার পরামর্শ হ'ল ঠিকানা তালিকা এবং প্রিন্টের প্রবেশদ্বারগুলি পরীক্ষা করা যা উপযুক্ত। আমার ক্ষেত্রে এন্ট্রি 3 ছিল আমার মেশিনের আইপিভি 4 ঠিকানা

IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName());
IPAddress ipAddr = ipHost.AddressList[3];
string ip = ipAddr.ToString();

যুক্ত করতে ভুলবেন না using System.Net;


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

আমি এটাই বলেছি, আপনার ঠিকানা তালিকার প্রবেশদ্বারগুলি পরীক্ষা করা উচিত, এবং হ্যাঁ এটি অনুমান করা যায়, তবে সমস্ত এন্ট্রি দেখার পরে অনুমান করা খুব বেশি কঠিন নয়
বিবাসওয়ান বন্দ্যোপাধ্যায়

আপনি কীভাবে জানবেন কোনটি উপযুক্ত? Compman2048 এর সমাধান ব্যবহার করে, আপনি কমপক্ষে জানতে পারবেন কোনটি কোন ইন্টারফেসের সাথে আবদ্ধ।
চিহ্নিত করুন

এই সমাধানটি আমার কম্পিউটারে কার্যকর হয়নি, কারণ আমার কাছে 2 টি ওয়ালান ইন্টারফেস, 2 ভার্চুয়াল মেশিন এবং 1 এমুলেটর রয়েছে, তাই আমি প্রচুর আইপি পেয়েছি। তবে আপনি যদি রাউটারের দ্বারা সরবরাহিত অভ্যন্তরীণ ঠিকানা সন্ধান করছেন তবে এটি 192 বা 172 বা 10 দিয়ে শুরু হবে,
এটিই

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