2013-02-01 29 views
27

मैंने बहुत सारे गुगल किए हैं लेकिन मेरे मुद्दों के साथ बहुत भाग्य नहीं है। मैं नेटवर्क प्रोग्रामिंग के लिए नया हूं और सीखने की कोशिश कर रहा हूं, मैंने एक सरल सर्वर & क्लाइंट स्थापित करने का प्रयास किया है (यहां स्थित एक ऑनलाइन ट्यूटोरियल ->http://tech.pro/tutorial/704/csharp-tutorial-simple-threaded-tcp-server)मैं त्रुटि को कैसे ठीक करूं "प्रत्येक सॉकेट पते (प्रोटोकॉल/नेटवर्क पता/पोर्ट) का केवल एक ही उपयोग सामान्य रूप से अनुमति है"?

मेरे पास यह मुद्दा है कि मैं रखता हूं अपवाद प्राप्त करना "सर्वर पर TcpListener प्रारंभ करने का प्रयास करते समय" प्रत्येक सॉकेट पते (प्रोटोकॉल/नेटवर्क पता/पोर्ट) का केवल एक ही उपयोग होता है "।

मैंने अपनी फ़ायरवॉल को अक्षम करने, बंदरगाह को बदलने के लिए बदलने, चारों ओर चर बदलने के लिए प्रयास किया है, लेकिन कोई फायदा नहीं हुआ है (क्लाइंट ठीक काम करता है, लेकिन यह स्पष्ट रूप से सर्वर नहीं ढूंढ सकता क्योंकि मैं इसे लॉन्च नहीं कर सकता)।

मैंने सॉकेट.पॉल() के उपयोग का वर्णन करने वाले समाधान देखे हैं, लेकिन चूंकि मैं केवल टीसीपीलिस्टर ऑब्जेक्ट का उपयोग कर रहा हूं, मुझे नहीं पता कि पोल फ़ंक्शन का उपयोग कैसे करें।

मेरे कोड:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net.Sockets; 
using System.Net; 
using System.Threading; 
using System.Text; 

namespace ServerTutorial { 
class Server { 
    private readonly Thread m_listenThread; 

    public Server() { 
     m_listenThread = new Thread(new ThreadStart(ListenForClients)); 
     m_listenThread.Start(); 
    } 

    public void ListenForClients() { 
     var listener = new TcpListener(IPAddress.Any, 3000); 
     listener.Start(); 

     while (true) { 
      //Blocks until a client has connected to the server 
      TcpClient client = listener.AcceptTcpClient(); 

      //Send a message to the client 
      var encoder = new ASCIIEncoding(); 
      NetworkStream clientStream = client.GetStream(); 
      byte[] buffer = encoder.GetBytes("Hello Client!"); 
      clientStream.Write(buffer, 0, buffer.Length); 
      clientStream.Flush(); 

      //Create a thread to handle communication with the connected client 
      var clientThread = new Thread(new ParameterizedThreadStart(HandleClient)); 
      clientThread.Start(client); 
     } 
    } 

    private void HandleClient(object clientObj) { //Param thread start can only accept object types, hence the cast 
     var client = (TcpClient) clientObj; 
     NetworkStream clientStream = client.GetStream(); 

     var message = new byte[4096]; 

     while (true) { 
      int bytesRead = 0; 

      try { 
       //Block until a client sends a message 
       bytesRead = clientStream.Read(message, 0, 4096); 
      } catch { 
       //A socket error has occurred 
       System.Diagnostics.Debug.WriteLine("A socket error has occured"); 
       break; 
      } 

      if (bytesRead == 0) { 
       //The client has disconnected from the server 
       System.Diagnostics.Debug.WriteLine("A client has disconnected from the server"); 
       client.Close(); 
       break; 
      } 

      //Message has been received 
      var encoder = new ASCIIEncoding(); 
      System.Diagnostics.Debug.WriteLine(encoder.GetString(message, 0, bytesRead)); 
     } 
    } 
} 
} 

अपने मुख्य विधि में:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ServerTutorial { 
class Program { 
    static void Main(string[] args) { 
     var server = new Server(); 
     server.ListenForClients(); 
    } 
} 
} 

किसी भी मदद की बेहद सराहना की है!

+0

'mingw-w64' पर नोट आपको पोर्ट को मुक्त करने के लिए' closesocket() 'और' बंद() 'की आवश्यकता नहीं है। – Jeroen

उत्तर

23

ListenForClients दो बार (दो अलग-अलग धागे पर) बुलाया जा रहा है - एक बार कन्स्ट्रक्टर से, एक बार स्पष्ट विधि कॉल से Main में। जब TcpListener के दो उदाहरण एक ही बंदरगाह पर सुनने की कोशिश करते हैं, तो आपको वह त्रुटि मिलती है।

+2

+1 जो यह भी बताता है कि जब आपने पोर्ट नंबर –

+1

बदल दिया तो आपको अभी भी त्रुटि क्यों मिली है! कभी-कभी मूर्खतापूर्ण चीज़ों को नजरअंदाज करना इतना आसान होता है! : डी <3 –

8

आप दो या अधिक बार डिबग कर रहे हैं। तो एप्लिकेशन एक समय में अधिक चला सकता है। तब केवल यह मुद्दा होगा। आपको कार्य-प्रबंधक का उपयोग करके सभी डिबगिंग अनुप्रयोगों को बंद करना चाहिए, फिर फिर से डीबग करें।