2011-08-29 13 views
6

के कारण निरस्त कर दिया गया है मेरा एप्लिकेशन बैंक सर्वर के लिए क्लाइंट एप्लिकेशन के रूप में काम कर रहा है। आवेदन अनुरोध भेज रहा है और बैंक से प्रतिक्रिया प्राप्त कर रहा है। इस एप्लिकेशन के पास सामान्य रूप से ठीक काम कर रहा है, लेकिन कभी कभीआई/ओ ऑपरेशन को थ्रेड निकास या एप्लिकेशन अनुरोध

आई/ओ आपरेशन या तो एक धागे से बाहर निकलें या 995 के रूप में त्रुटि कोड के साथ एक आवेदन अनुरोध

त्रुटि आ रहा है की वजह से रोक दी गई है।

public void OnDataReceived(IAsyncResult asyn) 
{ 
    BLCommonFunctions.WriteLogger(0, "In :- OnDataReceived", 
             ref swReceivedLogWriter, strLogPath, 0); 
    try 
    { 
     SocketPacket theSockId = (SocketPacket)asyn.AsyncState; 

     int iRx = theSockId.thisSocket.EndReceive(asyn); //Here error is coming 
     string strHEX = BLCommonFunctions.ByteArrToHex(theSockId.dataBuffer);      

    } 
} 

एक बार इस त्रुटि सभी लेनदेन के लिए आने के लिए है कि एक ही त्रुटि के बाद प्रकट करने के लिए शुरू शुरू करते हैं, तो इस समस्या को सुलझाने के लिए मेरी मदद करें। यदि संभव हो तो फिर कुछ नमूना कोड

सादर, आशीष खंडेलवाल

+0

कुछ विंडोज़ त्रुटियां हैं जो वर्णनात्मक और भरोसेमंद हैं। हम आपको उस धागे को खोजने में मदद नहीं कर सकते जो बहुत जल्दी समाप्त हो रहा है। अगर आपको यह नहीं मिल रहा है तो अपने कोड में कुछ ट्रेसिंग जोड़ें। –

उत्तर

9

995 के साथ IO Completion Port द्वारा रिपोर्ट एक त्रुटि है। त्रुटि तब आती है जब आप सॉकेट से पढ़ना जारी रखने का प्रयास करते हैं, जब इसे अधिकतर बंद कर दिया जाता है।

EndRecieve से 0 बाइट प्राप्त करने का अर्थ है कि सॉकेट बंद कर दिया गया है, क्योंकि अधिकांश अपवाद EndRecieve फेंक देंगे।

आपको उन स्थितियों से निपटना शुरू करना होगा।

कभी भी अपवादों को अनदेखा न करें, उन्हें किसी कारण से फेंक दिया जाता है।

अद्यतन

कुछ भी नहीं है कि का कहना है कि सर्वर कुछ भी गलत करता है। स्विच/राउटर/फ़ायरवॉल आदि द्वारा निष्क्रिय कनेक्शन बंद होने के कारण कई कारणों से एक कनेक्शन खो जा सकता है। नेटवर्क विफलताओं को भी होने के लिए।

मैं जो कह रहा हूं वह है कि आपको डिस्कनेक्शन को संभालना होगा। ऐसा करने का उचित तरीका सॉकेट का निपटान करना और कुछ अंतराल पर एक नया कनेक्ट करने का प्रयास करना है।

से निपटने यह इस (अर्ध छद्म कोड) की तरह कुछ है की एक और अधिक उचित तरीके से कॉलबैक प्राप्त के लिए के रूप में:

public void OnDataReceived(IAsyncResult asyn) 
{ 
    BLCommonFunctions.WriteLogger(0, "In :- OnDataReceived", ref swReceivedLogWriter, strLogPath, 0); 

    try 
    { 
     SocketPacket client = (SocketPacket)asyn.AsyncState; 

     int bytesReceived = client.thisSocket.EndReceive(asyn); //Here error is coming 
     if (bytesReceived == 0) 
     { 
      HandleDisconnect(client); 
      return; 
     } 
    } 
    catch (Exception err) 
    { 
     HandleDisconnect(client); 
    } 

    try 
    { 
     string strHEX = BLCommonFunctions.ByteArrToHex(theSockId.dataBuffer);      

     //do your handling here 
    } 
    catch (Exception err) 
    { 
     // Your logic threw an exception. handle it accordinhly 
    } 

    try 
    { 
     client.thisSocket.BeginRecieve(.. all parameters ..); 
    } 
    catch (Exception err) 
    { 
     HandleDisconnect(client); 
    } 
} 

कारण है कि मैं तीन कैच ब्लॉक का उपयोग कर रहा करने के लिए कारण बस है, क्योंकि के लिए तर्क मध्य एक दूसरे से अलग है। BeginReceive/EndReceive से अपवाद आमतौर पर सॉकेट डिस्कनेक्शन इंगित करते हैं जबकि आपके तर्क से अपवाद सॉकेट प्राप्त करना बंद नहीं करना चाहिए।

+1

प्रिय jgauffin, आपकी प्रतिक्रिया के लिए धन्यवाद, लेकिन मुद्दा यह है कि केवल ग्राहक आवेदन हमारी कंपनी से है और सर्वर कुछ बैंक से है, इसलिए यदि सॉकेट अपनी तरफ से बंद हो जाता है तो उन्हें कैसे व्यक्त किया जाए कि यह समस्या उनके पक्ष से भी है, हम कैसे कर सकते हैं अपवाद के बिना इसे संभाल लें यानी यह अंतहीन में अपवाद फेंकता है, क्या हम कोई भी आदेश लिख सकते हैं जो हमें बताएगा कि डेटा प्राप्त करना 0 – funsukvangdu

+1

मेरा अपडेट पढ़ा है। – jgauffin

+0

@funsukvangdu: क्या आपके कोई और प्रश्न हैं? – jgauffin

4

मुझे आरएस 232 संचार के साथ एक ही समस्या थी। कारण यह है कि आपका प्रोग्राम कॉम्पोर्ट (या धीमी सीरियल संचार) से बहुत तेज निष्पादित करता है।

इसे ठीक करने के लिए, मुझे यह जांचना पड़ा कि IAsyncResult.IsCompleted==true है या नहीं। पूरा नहीं किया है, तो IAsyncResult.AsyncWaitHandle.WaitOne()

इस तरह

:

Stream s = this.GetStream(); 
IAsyncResult ar = s.BeginWrite(data, 0, data.Length, SendAsync, state); 
if (!ar.IsCompleted) 
    ar.AsyncWaitHandle.WaitOne(); 

अधिकांश समय, ar.IsCompletedtrue हो जाएगा।

+0

यह एक जादू की तरह काम कर रहा है! धन्यवाद –

0

मैं जब ऐसा होता है क्या करना और इसे फिर से सक्षमअक्षमडिवाइस प्रबंधक में COM पोर्ट है।

यह किसी अन्य प्रोग्राम या धागे के साथ संचार को रोकता है और आपके लिए स्वतंत्र हो जाता है।

मुझे आशा है कि यह आपके लिए काम करेगा। सादर।

0

मुझे यह समस्या थी। मुझे लगता है कि यह सॉकेट खोला जा रहा था और खुले के बाद थोड़े समय के भीतर कोई डेटा नहीं आ रहा था। मैं एक सीरियल से ईथरनेट बॉक्स में पढ़ रहा था जिसे डेविसमस्टर कहा जाता है। मैंने देवसेमस्टर पोर्ट सेटिंग को "हमेशा कनेक्ट" से "डेटा से कनेक्ट" करने के लिए बदल दिया और समस्या गायब हो गई। मुझे हंस पासेंट के लिए बहुत सम्मान है लेकिन मैं इस बात से सहमत नहीं हूं कि यह एक त्रुटि कोड है जिसे आप कोड की जांच करके आसानी से हल कर सकते हैं।

संबंधित मुद्दे