सी # में, टीसीपी पोर्ट उपलब्ध होने पर कैसे जांच करें?


120

C # में TcpClient का उपयोग करने के लिए या आम तौर पर एक सॉकेट से कनेक्ट करने के लिए कैसे मैं पहली बार जांच कर सकता हूं कि क्या मेरी मशीन पर एक निश्चित पोर्ट मुफ्त है?

अधिक जानकारी: यह मेरे द्वारा उपयोग किया जाने वाला कोड है:

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, इसका मतलब है कि आप खुले टीसीपी पोर्ट की जांच कर रहे हैं। System.Net.NetworkInformation नामस्थान में बहुत सारी अच्छी वस्तुएँ उपलब्ध हैं ।

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
यह प्रासंगिक है कि यह ओपी के अनुरोध का जवाब देता है। स्थानीय / दूरस्थ अंतर के बावजूद (पूरी तरह से आपके साथ सहमत), ओपी की आवश्यकता एक पोर्ट के साथ एक नया TcpClient बनाने के लिए थी जो "मुक्त" है।
२१

8
ध्यान दें कि यह कोड केवल सक्रिय कनेक्शन की जांच करता है। जिन कनेक्शनों ने पैकेट नहीं भेजे या प्राप्त किए हैं, उन्हें सूचीबद्ध नहीं किया जाएगा।
जोबिली

29
ऊपर दिए गए कोड के परिणाम की तुलना करें netstat -a -b। ध्यान दें कि LISTENINGकनेक्शन मौजूद नहीं हैं GetActiveTcpConnections()। तुम भी System.Net.IPEndPoints[]लौटे में जाँच करना चाहिएipGlobalProperties.GetActiveTcpListeners();
माइक डे Klerk

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

के साथ विफल:

प्रत्येक सॉकेट एड्रेस (प्रोटोकॉल / नेटवर्क एड्रेस / पोर्ट) के केवल एक उपयोग की अनुमति है।


यहीं मैं उसके साथ भी जा रहा था। कोई निश्चित रूप से यहाँ उलझन में है, और यह मुझे संभव है।
Moose

3
यह संभव है कि क्लाइंट को एक निश्चित पोर्ट की भी आवश्यकता हो, लेकिन यह आम नहीं है।
डेव वान डेन आईंडी

@DaveVandenEynde जो केवल तभी हो सकता है यदि "क्लाइंट" वास्तव में उस विशेष पोर्ट पर कुछ "सेवारत" कर रहा है (कम से कम उस पोर्ट के लिए, जहां तक ​​टीसीपी का संबंध है)। - जब आपके पास एक क्लाइंट टीसीपी कनेक्शन होता है, तो आपको आउटगोइंग पोर्ट को नियंत्रित करने की आवश्यकता नहीं है। टीसीपी स्टैक आपको एक आउटगोइंग पोर्ट प्रदान करता है, और आपके पास इस पर कोई नियंत्रण नहीं है।
BrainSlugs83

1
@ BrainSlugs83 आप सबसे निश्चित रूप से कर सकते हैं: stackoverflow.com/questions/2869840/…
डेव वान डेन आईंड

पोर्ट फ्री है या नहीं, यह जांचने के लिए एक वैध बिट कोड है। बस रोकें याद रखें () TcpListener के मामले में यह सफल होता है (जब तक कि आप पोर्ट पर सुनना शुरू करने के लिए उसी TcpListener ऑब्जेक्ट का उपयोग करने का इरादा नहीं रखते)।
bgh

19

जब आप एक टीसीपी कनेक्शन स्थापित करते हैं, तो 4-टपल (सोर्स-आईपी, सोर्स-पोर्ट, डेस्ट-आईपी, डेस्ट-पोर्ट) को विशिष्ट होना पड़ता है - यह सुनिश्चित करने के लिए है कि पैकेट को सही जगह पर पहुंचाया जाए।

सर्वर पर आगे प्रतिबंध है ओर कि केवल एक सर्वर प्रोग्राम एक आने वाले पोर्ट नंबर (एक आईपी पते को मानते हुए; मल्टी-एनआईसी सर्वरों के पास अन्य शक्तियां हैं, लेकिन हम उन्हें यहां चर्चा करने की आवश्यकता नहीं है) से बांध सकते हैं।

तो, सर्वर अंत में, आप:

  • एक सॉकेट बनाएं।
  • उस सॉकेट को एक पोर्ट से बांधें।
  • उस बंदरगाह पर सुनो।
  • उस पोर्ट पर कनेक्शन स्वीकार करें। और (ग्राहक प्रति एक) में कई कनेक्शन आ सकते हैं।

ग्राहक के अंत में, यह आमतौर पर थोड़ा सरल होता है:

  • एक सॉकेट बनाएं।
  • कनेक्शन खोलें। जब कोई क्लाइंट कनेक्शन खोलता है, तो यह सर्वर का आईपी पता और पोर्ट निर्दिष्ट करता है । यह अपने स्रोत पोर्ट को निर्दिष्ट कर सकता है लेकिन आमतौर पर शून्य का उपयोग करता है जो सिस्टम में परिणाम देता है यह स्वचालित रूप से एक मुफ्त पोर्ट निर्दिष्ट करता है।

नहीं है कोई आवश्यकता है कि गंतव्य IP / पोर्ट अद्वितीय हो क्योंकि इसके परिणामस्वरूप एक समय में केवल एक ही व्यक्ति Google का उपयोग कर पाएगा, और यह उनके व्यवसाय मॉडल को अच्छी तरह से नष्ट कर देगा।

इसका अर्थ है कि आप कई सत्रों की स्थापना के बाद से ऐसी चमत्कारिक चीजें भी कर सकते हैं जैसे कि आप कई सत्रों में सेट करते हैं जहां एकमात्र अंतर आपके स्रोत पोर्ट है, जिससे आप समानांतर में विखंडू डाउनलोड कर सकते हैं। Torrents थोड़ा अलग हैं कि प्रत्येक सत्र का गंतव्य आमतौर पर अलग होता है।

और, उस सब के बाद वेफलिंग (क्षमा करें), आपके विशिष्ट प्रश्न का उत्तर यह है कि आपको एक मुफ्त पोर्ट निर्दिष्ट करने की आवश्यकता नहीं है। यदि आप किसी ऐसे सर्वर से सर्वर से जुड़ रहे हैं जो आपके स्रोत पोर्ट को निर्दिष्ट नहीं करता है, तो यह निश्चित रूप से कवर के तहत शून्य का उपयोग करेगा और सिस्टम आपको अप्रयुक्त एक देगा।


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 == true) तो पोर्ट कनेक्शन के लिए खुला है, कुछ सर्वर जैसा सॉफ्टवेयर वहां सुन रहा है। अगर 10061 एररकोड (संदेश "(0x80004005)) के साथ सॉकेट एक्ससेप्शन है: कोई कनेक्शन नहीं बनाया जा सकता है क्योंकि टारगेट मशीन ने इसे सक्रिय रूप से मना कर दिया है" तो पोर्ट बंद है!
Csaba Toth

तो यह कोड स्निपेट में चारों ओर का दूसरा तरीका है। एक और नोट: यदि कोई ऐसे परीक्षण सेटअप में Dns.GetHostEntry की कोशिश करेगा, जहां आपके पास केवल आईपी पते वाले वर्चुअल सर्वर हैं, तो आपके पास एक अपवाद है।
सेसाबा तोथ

3

netstat! यह एक नेटवर्क कमांड लाइन उपयोगिता है जो खिड़कियों के साथ जहाज करता है। यह सभी वर्तमान स्थापित कनेक्शन और वर्तमान में सुने जा रहे सभी पोर्ट दिखाता है। आप इस प्रोग्राम का उपयोग चेक करने के लिए कर सकते हैं, लेकिन यदि आप इसे System.Net.NetworkInformation नामस्थान में कोड लुक से करना चाहते हैं? यह 2.0 के रूप में एक नया नामस्थान है। वहाँ कुछ अच्छाई है। लेकिन अंत में अगर आप उसी तरह की जानकारी प्राप्त करना चाहते हैं जो कमांड नेटस्टैट के माध्यम से उपलब्ध है, तो आपको पी / इनवोक के परिणाम की आवश्यकता होगी ...

अपडेट: System.Net.NetworkInformation

उस नाम स्थान में उन कक्षाओं का एक समूह होता है, जिनका उपयोग आप नेटवर्क के बारे में चीजों का पता लगाने के लिए कर सकते हैं।

मुझे कोड का वह पुराना जखीरा नहीं मिला, लेकिन मुझे लगता है कि आप खुद भी कुछ ऐसा ही लिख सकते हैं। एक अच्छी शुरुआत आईपी ​​हेल्पर एपीआई की जांच करना हैGetTcpTable WinAPI फ़ंक्शन के लिए Google MSDN और जब तक आपके पास आवश्यक जानकारी न हो, तब तक पी / इनवॉइस का उपयोग करें।


मैं .NET 3.5 का उपयोग कर रहा हूं और मैं इसे ठीक नहीं कर सकता।
अली

मुझे आपके लिए ठीक करने दें: msdn.microsoft.com/en-us/library/…
bzlm

3

अगर मैं बहुत ज्यादा गलत नहीं हूँ, तो आप जाँच करने के लिए System.Network.whatever का उपयोग कर सकते हैं।

हालांकि, यह हमेशा एक दौड़ की स्थिति को उकसाएगा।

चेकिंग का विहित तरीका उस पोर्ट पर सुनने की कोशिश करता है। यदि आपको कोई त्रुटि मिलती है जो पोर्ट ओपन नहीं थी।

मुझे लगता है कि यह बाँध क्यों है () और सुनो () दो अलग-अलग सिस्टम कॉल हैं।


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

मैं आपको VB.NET का उपयोग करने वालों के लिए एक समान कार्य देता हूं :

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

डॉटनेट कोर 3.1 में एक मुफ्त पोर्ट (जो मुझे अपनी इकाई परीक्षणों में आवश्यक है) खोजने के सटीक प्रश्न का उत्तर देने के लिए मैं यह आया

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

चेक-इन करने के बीच की समय-खिड़की से अवगत रहें और जिस क्षण आप कनेक्शन बनाने की कोशिश करेंगे, वह पोर्ट-क्लासिकल TOCTOU ले सकता है । आप कनेक्ट करने का प्रयास क्यों नहीं करते? यदि यह विफल रहता है तो आपको पता है कि पोर्ट उपलब्ध नहीं है।


4
TOCTOU YALAIHHOBIKTPBI है (फिर भी एक और लंबी संक्षिप्तता, जिसके बारे में मैंने सुना नहीं है, लेकिन मुझे पता है कि यह पीछे है)
Csaba Toth

1

आपको यह जानने की ज़रूरत नहीं है कि कुछ दूरस्थ टीसीपी सेवा से जुड़ने के लिए आपके स्थानीय मशीन पर कौन से पोर्ट खुले हैं (जब तक कि आप किसी विशिष्ट स्थानीय पोर्ट का उपयोग नहीं करना चाहते हैं, लेकिन आमतौर पर ऐसा नहीं होता है)।

हर टीसीपी / आईपी कनेक्शन को 4 मानों से पहचाना जाता है: रिमोट आईपी, रिमोट पोर्ट नंबर, लोकल आईपी, लोकल पोर्ट नंबर, लेकिन कनेक्शन स्थापित करने के लिए आपको केवल रिमोट आईपी और रिमोट पोर्ट नंबर की जानकारी होनी चाहिए।

जब आप tcp कनेक्शन का उपयोग कर बनाते हैं

TcpClient c;
c = new TcpClient (रिमोट_आईपी, रिमोट_पोर्ट);

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


यह दिए गए सॉकेट के एक सेट की जाँच करने के लिए अच्छा है। सवाल सिर्फ एक सॉकेट के बारे में है (कौन सा पोर्ट नंबर शायद अनिर्धारित हालांकि (?))
Csaba Toth

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++;
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.