2011-03-04 14 views
6

मेरे पास एक बहुत ही सरल असीमित यूडीपी श्रोता है, जो सेवा के रूप में सेटअप है, और यह थोड़ी देर के लिए काफी अच्छा काम कर रहा है, लेकिन हाल ही में यह सॉकेटएक्सप्शन An existing connection was forcibly closed by the remote host पर दुर्घटनाग्रस्त हो गया है। मेरे पास तीन प्रश्न हैं:सी # असिनक यूडीपी श्रोता सॉकेटएक्सप्शन

  1. इसका क्या कारण है? (मुझे नहीं लगता था कि यूडीपी सॉकेट के पास कनेक्शन था)
  2. परीक्षण उद्देश्यों के लिए मैं इसे कैसे डुप्लिकेट कर सकता हूं?
  3. मैं अपवाद को कैसे साफ कर सकता हूं, इसलिए सब कुछ काम जारी रहेगा?

    private Socket udpSock; 
    private byte[] buffer; 
    public void Starter(){ 
        //Setup the socket and message buffer 
        udpSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
        udpSock.Bind(new IPEndPoint(IPAddress.Any, 12345)); 
        buffer = new byte[1024]; 
    
        //Start listening for a new message. 
        EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0); 
        udpSock.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, udpSock); 
    } 
    
    private void DoReceiveFrom(IAsyncResult iar){ 
        try{ 
         //Get the received message. 
         Socket recvSock = (Socket)iar.AsyncState; 
         EndPoint clientEP = new IPEndPoint(IPAddress.Any, 0); 
         int msgLen = recvSock.EndReceiveFrom(iar, ref clientEP); 
         byte[] localMsg = new byte[msgLen]; 
         Array.Copy(buffer, localMsg, msgLen); 
    
         //Start listening for a new message. 
         EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0); 
         udpSock.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, udpSock); 
    
         //Handle the received message 
         Console.WriteLine("Recieved {0} bytes from {1}:{2}", 
              msgLen, 
              ((IPEndPoint)clientEP).Address, 
              ((IPEndPoint)clientEP).Port); 
         //Do other, more interesting, things with the received message. 
        } catch (ObjectDisposedException){ 
         //expected termination exception on a closed socket. 
         // ...I'm open to suggestions on a better way of doing this. 
        } 
    } 
    

    अपवाद recvSock.EndReceiveFrom() लाइन पर फेंक दिया जा रहा है:

मेरे कोड निम्नलिखित की तरह कुछ लग रहा है।

उत्तर

13

this forum thread से ऐसा प्रतीत होता है कि UDP सॉकेट भी ICMP संदेशों को प्राप्त करने और अपवादों फेंक जब वे प्राप्त कर रहे हैं है। शायद यह निम्न स्तर की स्थिति अपडेट के लिए बहुत अच्छा है, लेकिन मुझे यह परेशान पाया।

पहले, जादुई संख्या

public const int SIO_UDP_CONNRESET = -1744830452; 

तब इन संदेशों को अनदेखा करने के लिए निम्न स्तर कब नियंत्रण सेट को परिभाषित:

var client = new UdpClient(endpoint); 
client.Client.IOControl(
    (IOControlCode)SIO_UDP_CONNRESET, 
    new byte[] { 0, 0, 0, 0 }, 
    null 
); 
+0

ग्रेट मैन के नीचे क्या चल रहा है! हाय को आईसीएमपी संदेशों को प्राप्त करने और प्राप्त होने पर अपवाद फेंकने की एक ही समस्या थी। जो आपके कोडिंग चाल से हल हो जाता है! – Kevan

+0

@ केली, आखिर में मैं पूरी तरह से परीक्षण करने के लिए चारों ओर मिल गया! ऐसा लगता है कि यह अपवाद का वास्तविक मूल कारण था। संदर्भ के लिए, मैंने आपके उत्तर और जिम दोनों का उपयोग करके समाप्त कर दिया, ताकि अगर कोई अपवाद हो, तो श्रोता पुनरारंभ हो जाता है। – chezy525

+0

टूटा लिंक। यह उत्तर लिंक को अपडेट करने या लिंक को इंगित करने वाली जानकारी को शामिल करने के लिए बदला जाना चाहिए। –

2

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

मैं सुझाव दूंगा कि आप SocketException पकड़ लें, इसे लॉग करें (यदि आप चाहते हैं), और उसके बाद उस सॉकेट का निपटान करें। तब Starter फिर से फोन:

catch (SocketException) 
{ 
    // log error 
    udpSock.Close(); 
    Starter(); 
} 
+0

यह मैं क्या कर समाप्त हो गया है, लेकिन मैं अभी भी करना चाहते हैं वास्तव में इस अपवाद का कारण क्या है (यानी साबित करें कि आपको क्या लगता है सही है)। – chezy525

+0

@ chezy525 मेरा मानना ​​है कि ये सॉकेट अपवाद आमतौर पर आपकी सॉकेट पर आईसीएमपी "गंतव्य/पोर्ट/आदि पहुंचने योग्य" संदेशों से उत्पन्न होते हैं। अगर आप सिर्फ सुन रहे हैं तो आप कैसे प्राप्त करेंगे, मुझे यकीन नहीं है। सिर्फ एक विचार। – Kongress

+0

system.net ट्रेसिंग को सक्षम करने का प्रयास करें और देखें कि –