সি # তে, টিসিপি পোর্ট পাওয়া যায় কিনা তা কীভাবে পরীক্ষা করবেন?


120

সি # তে একটি টিসিপিসিলেট ব্যবহার করতে বা সাধারণত সকেটের সাথে সংযোগ স্থাপনের জন্য আমি কীভাবে প্রথমে আমার মেশিনে কোনও নির্দিষ্ট বন্দর মুক্ত কিনা তা পরীক্ষা করতে পারি?

আরও তথ্য: এই কোডটি আমি ব্যবহার করি:

TcpClient c;
//I want to check here if port is free.
c = new TcpClient(ip, port);

2
এখানে "ফ্রি" বলতে কী বোঝ? যদি আপনি এটির সাথে সংযোগ স্থাপনের চেষ্টা করেন এবং ব্যর্থ হন তবে এর অর্থ সম্ভবত কিছু শুনছিল না।
জন স্কিটি

2
আমি বোঝাতে চাইছি এটি অন্য কোনও অ্যাপ্লিকেশন দ্বারা ব্যবহৃত হয় না। যদি কোনও অ্যাপ্লিকেশন কোনও বন্দর ব্যবহার করে থাকে তবে অন্যরা এটি বিনামূল্যে না হওয়া অবধি ব্যবহার করতে পারে না।
আলী

আপনি যে সার্ভারের সাথে সংযোগ দেওয়ার চেষ্টা করছেন তা কী? আপনি এটি লিখেছেন, বা এটি একটি বিদ্যমান সার্ভার?
শোক করুন

3
অনেক উত্তরে যেমন বলা হয়েছে, আপনার পিছনে সমস্ত কিছু রয়েছে। স্থানীয় বন্দর এবং দূরবর্তী বন্দরগুলি সম্পূর্ণ দুটি ভিন্ন জিনিস। বিশেষ করে এই উত্তরটি এটা ভাল ব্যাখ্যা করে: stackoverflow.com/questions/570098/...
bzlm

উত্তর:


217

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

অবজেক্টগুলির IPGlobalPropertiesএকটি অ্যারে পেতে অবজেক্টটি ব্যবহার করুন TcpConnectionInformation, যা আপনি এরপরে এন্ডপয়েন্ট আইপি এবং পোর্ট সম্পর্কে জিজ্ঞাসাবাদ করতে পারেন।


 int port = 456; //<--- This is your value
 bool isAvailable = true;

 // Evaluate current system tcp connections. This is the same information provided
 // by the netstat command line application, just in .Net strongly-typed object
 // form.  We will look through the list, and if our port we would like to use
 // in our TcpClient is occupied, we will set isAvailable to false.
 IPGlobalProperties ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties();
 TcpConnectionInformation[] tcpConnInfoArray = ipGlobalProperties.GetActiveTcpConnections();

 foreach (TcpConnectionInformation tcpi in tcpConnInfoArray)
 {
   if (tcpi.LocalEndPoint.Port==port)
   {
     isAvailable = false;
     break;
   }
 }

 // At this point, if isAvailable is true, we can proceed accordingly.

38
মনে রাখবেন যে আপনি পরীক্ষা করার সময় অন্য কোনও প্রক্রিয়া সেই বন্দরে বাঁধতে পারে।
সের্গেই

2
এটি প্রশ্নের সাথে কীভাবে প্রাসঙ্গিক? এই উত্তরটি দূরবর্তী বন্দরগুলির সাথে নয়, স্থানীয় বন্দরগুলির সাথে সম্পর্কিত ।
bzlm

6
এটি প্রাসঙ্গিক যে এটি ওপির অনুরোধের উত্তর দেয়। স্থানীয় / দূরবর্তী পার্থক্য সত্ত্বেও (সম্পূর্ণরূপে আপনার সাথে একমত), ওপি'র প্রয়োজনীয়তাটি ছিল একটি "মুক্ত" পোর্ট সহ একটি নতুন টিসিপিপ্লেইন্ট তৈরি করা।
jro

8
মনে রাখবেন যে এই কোডটি কেবল সক্রিয় সংযোগগুলি পরীক্ষা করে। যে সংযোগগুলি প্যাকেট প্রেরণ বা গ্রহণ করেনি সেগুলি তালিকাভুক্ত করা হবে না।
জোবিলি

29
উপরের কোডের ফলাফলের সাথে তুলনা করুন netstat -a -b। লক্ষ করুন যে LISTENINGসংযোগগুলি উপস্থিত নেই GetActiveTcpConnections()। তুমিও পরীক্ষা করা উচিত System.Net.IPEndPoints[]দ্বারা ফিরেipGlobalProperties.GetActiveTcpListeners();
মাইক ডি ক্লার্ক

44

আপনি ইন্টারটিউবের ভুল প্রান্তে আছেন। এটি সার্ভারেই কেবল একটি নির্দিষ্ট পোর্ট খোলা থাকতে পারে। কিছু কোড:

  IPAddress ipAddress = Dns.GetHostEntry("localhost").AddressList[0];
  try {
    TcpListener tcpListener = new TcpListener(ipAddress, 666);
    tcpListener.Start();
  }
  catch (SocketException ex) {
    MessageBox.Show(ex.Message, "kaboom");
  }

এতে ব্যর্থ:

প্রতিটি সকেটের ঠিকানার (প্রোটোকল / নেটওয়ার্ক ঠিকানা / পোর্ট) কেবলমাত্র এক ব্যবহারের জন্য অনুমোদিত।


আমিও সেখানে যাচ্ছিলাম। এখানে নিশ্চয়ই কেউ বিভ্রান্ত, এবং এটি আমার পক্ষে সম্ভব।
মোজ

3
এটা সম্ভব যে ক্লায়েন্টের জন্যও একটি নির্দিষ্ট বন্দর প্রয়োজন, তবে এটি সাধারণ নয়।
ডেভ ভ্যান ডেন আইন্দে

@ ডেভভ্যান্ডেনইয়েন্ডি কেবল তখনই ঘটতে পারে যখন "ক্লায়েন্ট" আসলে সেই নির্দিষ্ট বন্দরে কিছু "পরিবেশন করা" হয় (এটি একটি "সার্ভার" হিসাবে তৈরি করবে, কমপক্ষে সেই বন্দরের জন্য, যতক্ষণ না টিসিপি সম্পর্কিত)। - আপনার যখন ক্লায়েন্ট টিসিপি সংযোগ রয়েছে, আপনি বহির্গামী পোর্টটি নিয়ন্ত্রণ করতে পারবেন না। টিসিপি স্ট্যাক আপনাকে আউটগোয়িং বন্দর নির্ধারণ করে এবং এটিতে আপনার কোনও নিয়ন্ত্রণ নেই।
BrainSlugs83

1
@ ব্রেইনস্লাগস ৩৮ আপনি অবশ্যই এটি করতে পারেন: stackoverflow.com/questions/2869840/…
ডেভ ভ্যান ডেন এঁয়েডে

বন্দরটি মুক্ত কিনা তা যাচাই করার জন্য এটি কোডের একটি বৈধ বিট। TcpListener সাফল্যের ক্ষেত্রে থামাতে () কেবল মনে রাখবেন (যদি আপনি পোর্টে শোনা শুরু করতে সেই একই TcpListener অবজেক্টটি ব্যবহার করার ইচ্ছা না করেন)।
বিজিএইচ

19

আপনি একটি টিসিপি সংযোগ স্থাপন করার সময়, 4-টিউপল (উত্স-আইপি, উত্স-পোর্ট, ডেস্ট-আইপি, ডেস্ট-পোর্ট) অনন্য হতে হবে - এটি প্যাকেটগুলি সঠিক জায়গায় সরবরাহ করা হয় তা নিশ্চিত করা।

সার্ভারের পাশেই আরও বিধিনিষেধ রয়েছে যে কেবলমাত্র একটি সার্ভার প্রোগ্রামই আগত পোর্ট নম্বরে বাঁধতে পারে (একটি আইপি ঠিকানা ধরে নিলে; মাল্টি-এনআইসি সার্ভারের অন্যান্য ক্ষমতা রয়েছে তবে আমাদের সেগুলি এখানে আলোচনা করার দরকার নেই)।

সুতরাং, সার্ভার শেষে, আপনি:

  • একটি সকেট তৈরি করুন।
  • সেই সকেটকে একটি বন্দরে বাঁধুন।
  • এই বন্দরে শুনুন।
  • যে বন্দরে সংযোগ গ্রহণ করুন। এবং সেখানে একাধিক সংযোগ আসতে পারে (ক্লায়েন্ট প্রতি এক)।

ক্লায়েন্ট শেষে, এটি সাধারণত কিছুটা সহজ:

  • একটি সকেট তৈরি করুন।
  • সংযোগটি খুলুন। যখন কোনও ক্লায়েন্ট সংযোগটি খুলবে, এটি সার্ভারের আইপি ঠিকানা এবং পোর্টটি নির্দিষ্ট করে । এটি এর উত্স বন্দরটি নির্দিষ্ট করতে পারে তবে সাধারণত শূন্য ব্যবহার করে যার ফলে সিস্টেম স্বয়ংক্রিয়ভাবে একটি নিখর পোর্ট নির্ধারণ করে।

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

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

এবং, এই সমস্ত বিভ্রান্তির পরে (দুঃখিত), আপনার নির্দিষ্ট প্রশ্নের উত্তর হ'ল আপনাকে কোনও ফ্রি পোর্ট নির্দিষ্ট করার দরকার নেই। যদি আপনি এমন কোনও কল দিয়ে এমন কোনও সার্ভারের সাথে সংযোগ স্থাপন করছেন যা আপনার উত্স পোর্টটি নির্দিষ্ট করে না, তবে এটি অবশ্যই কভারগুলির নীচে শূন্য ব্যবহার করবে এবং সিস্টেমটি আপনাকে একটি অব্যবহৃত একটি দেবে।


15
TcpClient c;

//I want to check here if port is free.
c = new TcpClient(ip, port);

... আমার মেশিনে কোনও নির্দিষ্ট বন্দর মুক্ত কিনা আমি প্রথমে কীভাবে তা পরীক্ষা করতে পারি?

আমি বোঝাতে চাইছি এটি অন্য কোনও অ্যাপ্লিকেশন দ্বারা ব্যবহৃত হয় না। যদি কোনও অ্যাপ্লিকেশন কোনও বন্দর ব্যবহার করে থাকে তবে অন্যরা এটি বিনামূল্যে না হওয়া অবধি ব্যবহার করতে পারে না। - আলী

এখানে কী হচ্ছে আপনি ভুল বুঝে গেছেন।

TcpClient (...) প্যারামিটারগুলি সার্ভার আইপি এবং সার্ভার পোর্টের সাথে সংযোগ করতে চান।

TcpClient সার্ভারের সাথে যোগাযোগের জন্য উপলব্ধ পুল থেকে একটি ক্ষণস্থায়ী স্থানীয় পোর্ট নির্বাচন করে। উইনসক স্তরটি স্বয়ংক্রিয়ভাবে পরিচালিত হওয়ায় স্থানীয় বন্দরটির উপলব্ধতার জন্য যাচাই করার দরকার নেই।

আপনি উপরের কোড টুকরাটি ব্যবহার করে সার্ভারের সাথে সংযোগ স্থাপন করতে না পারলে সমস্যাটি একাধিকের এক বা একাধিক হতে পারে। (যেমন সার্ভার আইপি এবং / অথবা পোর্টটি ভুল, দূরবর্তী সার্ভার উপলব্ধ নেই, ইত্যাদি))


15

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

 private bool CheckAvailableServerPort(int port) {
    LOG.InfoFormat("Checking Port {0}", port);
    bool isAvailable = true;

    // Evaluate current system tcp connections. This is the same information provided
    // by the netstat command line application, just in .Net strongly-typed object
    // form.  We will look through the list, and if our port we would like to use
    // in our TcpClient is occupied, we will set isAvailable to false.
    IPGlobalProperties ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties();
    IPEndPoint[] tcpConnInfoArray = ipGlobalProperties.GetActiveTcpListeners();

    foreach (IPEndPoint endpoint in tcpConnInfoArray) {
        if (endpoint.Port == port) {
            isAvailable = false;
            break;
        }
    }

    LOG.InfoFormat("Port {0} available = {1}", port, isAvailable);

    return isAvailable;
}

আপনার এই দরকার নেই কেবল পোর্ট শূন্য নির্দিষ্ট করুন।
লার্নের মারকুইস

উত্স কোডের নোটটিতে মন্তব্য করা হয়েছে: "এটি নেটস্ট্যাট কমান্ড লাইন অ্যাপ্লিকেশন দ্বারা সরবরাহ করা একই তথ্য" - এটি মিথ্যা। এটি একই তথ্য সরবরাহ করে না যেমন নেটস্যাট কমান্ডটি পোর্ট ( -anb) ব্যবহার করে অ্যাপ্লিকেশনটির পিআইডি সরবরাহ করে এবং কোনও পরামিতি ছাড়াই এটি বিদেশী সংযোগের পাশাপাশি রাষ্ট্রকেও দেখায়।
ক্রাং প্রাইম

6

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

TcpConnectionInformation[] tcpConnInfoArray = ipGlobalProperties.GetActiveTcpConnections();

সঙ্গে

IPEndPoint[] objEndPoints = ipGlobalProperties.GetActiveTcpListeners();.  

আমার পোর্টের মান খুঁজে পাওয়া যায়নি তা পরীক্ষা করে আমি শেষের বিন্দুগুলির অ্যারের পুনরাবৃত্তি করলাম।


এটি নিজেই শোনার চেষ্টা করুন। আপনার এগুলির কোনও দরকার নেই।
লার্নের মারকুইস

5
string hostname = "localhost";
int portno = 9081;
IPAddress ipa = (IPAddress) Dns.GetHostAddresses(hostname)[0];


try
{
    System.Net.Sockets.Socket sock = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
    sock.Connect(ipa, portno);
    if (sock.Connected == true)  // Port is in use and connection is successful
            MessageBox.Show("Port is Closed");
    sock.Close();

}
catch (System.Net.Sockets.SocketException ex)
{
    if (ex.ErrorCode == 10061)  // Port is unused and could not establish connection 
        MessageBox.Show("Port is Open!");
    else
        MessageBox.Show(ex.Message);
}

আমিই সকেটের সাথে সংযোগ স্থাপনের চেষ্টা করছি। প্রশ্নটি আরও পরিষ্কার করার জন্য আমি সম্পাদনা করেছি।
আলী

আমি এই কোডটি সবচেয়ে পছন্দ করি, কেউ অন্য প্রান্তে শুনছেন বা না শুনছেন কিনা তা দেখার জন্য এটি সত্যই সকেটের সাথে একটি টিসিপি সংযোগ খোলে। এবং আমি মনে করি অনেক লোকেরা আসলে এটি চায়, যখন তারা "দূরবর্তী হোস্টে কোনও বন্দর খোলা থাকে কিনা" পরীক্ষা করতে চায়। উপরের কোডে তবে একটি ত্রুটি রয়েছে: যদি (sock.Connected == সত্য) তবে বন্দরটি সংযোগের জন্য উন্মুক্ত, কিছু সার্ভারের মতো সফ্টওয়্যার সেখানে শুনছে। যদি 100100 ত্রুটি কোড (বার্তা "(0x80004005) দিয়ে সকেটএক্সেপশন থাকে: কোনও সংযোগ তৈরি করা যায়নি কারণ টার্গেট মেশিন সক্রিয়ভাবে এটি অস্বীকার করেছিল" তবে বন্দরটি বন্ধ রয়েছে!
সিএসবা তোথ

সুতরাং এটি অন্য সীমা কাছাকাছি তারপর কোড স্নিপেট। অন্য দ্রষ্টব্য: যদি কেউ যদি কেবলমাত্র আইপি অ্যাড্রেস সহ ভার্চুয়াল সার্ভার থাকে এমন টেস্ট সেটআপে Dns.GetHostEntry চেষ্টা করে থাকেন তবে আপনার ব্যতিক্রম হবে।
সিএসবা তোথ

3

netstat কমান্ড! এটি একটি নেটওয়ার্ক কমান্ড লাইন ইউটিলিটি যা উইন্ডো দিয়ে জাহাজে আসে। এটি বর্তমানে প্রতিষ্ঠিত সমস্ত সংযোগ এবং সমস্ত পোর্ট বর্তমানে শোনা যাচ্ছে shows আপনি এই প্রোগ্রামটি চেক করতে ব্যবহার করতে পারেন, তবে আপনি কোড থেকে এটি করতে চাইলে সিস্টেম.নিট. নেটওয়ার্ক ইনফর্মেশন নেমস্পেসের দিকে নজর দিন? এটি 2.0 হিসাবে একটি নতুন নেমস্পেস। সেখানে কিছু গুডিজ আছে। তবে শেষ পর্যন্ত যদি আপনি একই ধরণের তথ্য নেটস্যাট কমান্ডের মাধ্যমে উপলভ্য হন তবে আপনাকে পি / ইনভোকের ফলাফল দিতে হবে ...

আপডেট: সিস্টেম.নেট. নেট ওয়ার্ক ইনফর্মেশন

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

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


আমি .NET 3.5 ব্যবহার করছি এবং আমি এটি জরিমানা করতে পারি না।
আলী

আমি আপনার জন্য এটি জরিমানা করতে দিন: msdn.microsoft.com/en-us/library/…
bzlm

3

যদি আমি খুব বেশি ভুল না হয়ে থাকি তবে আপনি চেক করতে System.Network.w काहीही ব্যবহার করতে পারেন।

যাইহোক, এটি সর্বদা একটি রেসের শর্ত বহন করবে।

ক্যানোনিকাল উপায় চেক করার চেষ্টা করা হয় সেই বন্দরে শোনার। আপনি যদি ত্রুটি পান তবে পোর্টটি খোলা ছিল না।

আমি মনে করি এটি কেন বাইন্ড () এবং শোনো () দুটি পৃথক সিস্টেম কল।


2

তুমি বলো

আমি বোঝাতে চাইছি এটি অন্য কোনও অ্যাপ্লিকেশন দ্বারা ব্যবহৃত হয় না। যদি কোনও অ্যাপ্লিকেশন কোনও বন্দর ব্যবহার করে থাকে তবে অন্যরা এটি বিনামূল্যে না হওয়া অবধি ব্যবহার করতে পারে না।

অন্যেরা যদি সেখানে কিছু শুনছে তবে এটি ব্যবহার করার সময় আপনি সর্বদা একটি বন্দরের সাথে সংযোগ রাখতে পারেন। অন্যথায়, HTTP পোর্ট 80 একটি গণ্ডগোল হবে।

যদি তোমার

   c = new TcpClient(ip, port);

ব্যর্থ হয়, তারপর সেখানে কিছুই শুনছে না। অন্যথায়, এটি সংযুক্ত হবে, এমনকি যদি অন্য কোনও মেশিন / অ্যাপ্লিকেশনটির সেই আইপি এবং পোর্টের জন্য সকেট খোলা থাকে।


আমার আবেদন করে দেখুন বন্দর 10 এবং আমার আবেদন করে দেখুন আরেকটি দৃষ্টান্ত ব্যবহার করে, আবার বন্দর 10 ব্যবহার কারণ তাদের উভয়ই অ্যাপ্লিকেশন এক বন্দর ব্যবহার করে তথ্য পাঠাতে পারবেন না এটা ব্যর্থ হবে সংযোগ করতে হলে তথ্য অর্থাৎ বন্দর 80 যে ভিন্ন প্রাপ্তির আসে সংযোগ করতে পারেন
আলী

এটা আলাদা কিভাবে? আপনার আবেদনের জন্য 10 পোর্টে কী শুনছে?
আমেরিকার হরিণবিশেষ

দ্বিতীয় বার সংযোগ দেওয়ার চেষ্টা করাতে যদি এটি ব্যর্থ হয় তবে এটি শ্রবণ অ্যাপ্লিকেশন, আপনার অ্যাপ্লিকেশন নয়।
আমেরিকার হরিণবিশেষ

2

ipGlobalProperties.GetActiveTcpConnections() শোনার রাজ্যে সংযোগ ফেরত দেয় না।

শোনার জন্য বন্দর ব্যবহার করা যেতে পারে, তবে কারও সাথে এটির সাথে সংযুক্ত না থাকলে উপরের বর্ণিত পদ্ধতিটি কার্যকর হবে না।


উপরে বর্ণিত কোন পদ্ধতি? কিভাবে এই প্রশ্নের উত্তর দেয়?
লার্নের মার্কুইস

2

উপলভ্য পোর্টগুলি থেকে আমি বাদ দেব:

  • সক্রিয় টিসিপি সংযোগগুলি
  • সক্রিয় টিসিপি শ্রোতা
  • সক্রিয় ইউডিপি শ্রোতা

নিম্নলিখিত আমদানি সহ:

using System.Net.NetworkInformation;

কোনও বন্দরটি উপলভ্য কিনা তা পরীক্ষা করতে আপনি নীচের ফাংশনটি ব্যবহার করতে পারেন:

private bool isPortAvalaible(int myPort)
{
    var avalaiblePorts = new List<int>();
    var properties = IPGlobalProperties.GetIPGlobalProperties();

    // Active connections
    var connections = properties.GetActiveTcpConnections();
    avalaiblePorts.AddRange(connections);

    // Active tcp listners
    var endPointsTcp = properties.GetActiveTcpListeners();
    avalaiblePorts.AddRange(endPointsTcp);

    // Active udp listeners
    var endPointsUdp = properties.GetActiveUdpListeners();
    avalaiblePorts.AddRange(endPointsUdp);

    foreach (int p in avalaiblePorts){
        if (p == myPort) return false;
    }
    return true;
}

যারা ভিবি.এনইটি ব্যবহার করেন তাদের জন্য আমি আপনাকে অনুরূপ ফাংশন দিচ্ছি :

Imports System.Net.NetworkInformation
Private Function isPortAvalaible(ByVal myPort As Integer) As Boolean
  Dim props As IPGlobalProperties = IPGlobalProperties.GetIPGlobalProperties()

  ' ignore active connections
  Dim tcpConnInfoArray() As TcpConnectionInformation = props.GetActiveTcpConnections()
  For Each tcpi As Net.NetworkInformation.TcpConnectionInformation In tcpConnInfoArray
    If tcpi.LocalEndPoint.Port = myPort Then
      Return False
    End If
  Next tcpi

  ' ignore active TCP listeners
  Dim activeTcpListeners() As Net.IPEndPoint = props.GetActiveTcpListeners
  For Each tcpListener As Net.IPEndPoint In activeTcpListeners
    If tcpListener.Port = myPort Then
      Return False
    End If
  Next tcpListener

  ' ignore active UPD listeners
  Dim activeUdpListeners() As Net.IPEndPoint = props.GetActiveUdpListeners
  For Each udpListener As Net.IPEndPoint In activeUdpListeners
    If udpListener.Port = myPort Then
      Return False
    End If
  Next udpListener

  Return True
End Function

2

ডটনেট কোর ৩.১ এ একটি মুক্ত বন্দর (যা আমার ইউনিট পরীক্ষায় আমার প্রয়োজন ছিল) সঠিক প্রশ্নের উত্তর দেওয়ার জন্য আমি এটি নিয়ে এসেছি

public static int GetAvailablePort(IPAddress ip) {
        TcpListener l = new TcpListener(ip, 0);
        l.Start();
        int port = ((IPEndPoint)l.LocalEndpoint).Port;
        l.Stop();
        Log.Info($"Available port found: {port}");
        return port;
    }

নোট: @ user207421 মন্তব্য বন্দর শূন্য সম্পর্কে আমি অনুসন্ধান দেখলেন ভিত্তিক এই এবং সামান্য এটি রুপান্তরিত করা হয়েছে।


1

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


4
স্পর্শটি হ'ল ইলাইহোবিবিপিটিবিআই (তবুও আমি আর একটি দীর্ঘ সংক্ষিপ্ত বিবরণ শুনতে পেলাম না, তবে এর পেছনের ঘটনাটি আমি জানি)
সিসাবা তোথ

1

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

প্রতিটি টিসিপি / আইপি সংযোগটি 4 টি মান দ্বারা চিহ্নিত করা হয়: রিমোট আইপি, রিমোট পোর্ট নম্বর, স্থানীয় আইপি, স্থানীয় পোর্ট নম্বর, তবে আপনাকে সংযোগ স্থাপনের জন্য কেবল দূরবর্তী আইপি এবং দূরবর্তী পোর্ট নম্বর জানতে হবে।

আপনি যখন ব্যবহার করে টিসিপি সংযোগ তৈরি করবেন

TcpClient গ;
সি = নতুন টিসিপিসিলেট (রিমোট_ইপ, রিমোট_পোর্ট);

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


প্রদত্ত সকেটের একটি সেট পরীক্ষা করার জন্য এটি ভাল। প্রশ্নটি কেবল একটি সকেট সম্পর্কে (কোন পোর্ট নম্বরটি সম্ভবত নির্ধারিত (?))
সিসাবা তোথ

1
    public static bool TestOpenPort(int Port)
    {
        var tcpListener = default(TcpListener);

        try
        {
            var ipAddress = Dns.GetHostEntry("localhost").AddressList[0];

            tcpListener = new TcpListener(ipAddress, Port);
            tcpListener.Start();

            return true;
        }
        catch (SocketException)
        {
        }
        finally
        {
            if (tcpListener != null)
                tcpListener.Stop();
        }

        return false;
    }

0
test_connection("ip", port);


public void test_connection(String hostname, int portno) {
  IPAddress ipa = (IPAddress)Dns.GetHostAddresses(hostname)[0];
  try {
    System.Net.Sockets.Socket sock = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
   sock.Connect(ipa, portno);
   if (sock.Connected == true) {
     MessageBox.Show("Port is in use");
   }

   sock.Close();
 }
 catch (System.Net.Sockets.SocketException ex) {
   if (ex.ErrorCode == 10060) {
     MessageBox.Show("No connection.");
   }
 }
}

1
কিছু কোড পোস্ট করার সময় এটি কেন সমস্যার সমাধান তা বিশদ করার চেষ্টা করুন। কেবল কোড খুব অল্প তথ্য হতে পারে এবং আপনার উত্তর ঝুঁকিগুলি সন্ধান করা হতে পারে।
গ্লাবাস

0

10048 নম্বর ত্রুটি কোডের জন্য চেক করুন

try
{
    TcpListener tcpListener = new TcpListener(ipAddress, portNumber);
    tcpListener.Start();
}
catch(SocketException ex)
{
    if(ex.ErrorCode == 10048)
    {
        MessageBox.Show("Port " + portNumber + " is currently in use.");
    }
    return;
}

-2

এটি ব্যবহার করে দেখুন, আমার ক্ষেত্রে তৈরি বস্তুর জন্য পোর্ট নম্বরটি উপলব্ধ ছিল না তাই আমি এটি নিয়ে এসেছি

IPEndPoint endPoint;
int port = 1;
while (true)
{
    try
    {
        endPoint = new IPEndPoint(IPAddress.Any, port);
        break;
    }
    catch (SocketException)
    {
         port++;
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.