2012-05-31 26 views
6

मैं अपने वितरित सिस्टम के लिए एक संदेश परत लिख रहा हूं। मैं आईओसीपी, यानी सॉकेट.XXXAsync विधियों का उपयोग कर रहा हूँ।सॉकेटएसिंसेन्ट आर्ट्स बफर शून्य से भरा है

यहाँ कुछ सुंदर के करीब है कि मैं क्या कर रहा हूँ (वास्तव में, समारोह प्राप्त मेरे अपने पर आधारित है) है: http://vadmyst.blogspot.com/2008/05/sample-code-for-tcp-server-using.html

क्या मैं अब पता चला है कि कार्यक्रम के शुरू में (दो परीक्षण सर्वर एक-दूसरे से बात करते हैं) मुझे हर बार कई SAEA ऑब्जेक्ट मिलते हैं जहां .Buffer पूरी तरह से शून्य से भरा हुआ है, फिर भी। BytesTransferred बफर का आकार (मेरे मामले में 1024) है।

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

मुझे निम्न मिला है जब मैंने इसे गोगल किया, लेकिन मुझे यकीन नहीं है कि मेरी समस्या एक जैसी है: http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/40fe397c-b1da-428e-a355-ee5a6b0b4d2c

http://go4answers.webhost4life.com/Example/socketasynceventargs-buffer-not-ready-121918.aspx

+0

मेरे पास खोए गए डेटा से कोई डेटा प्रोसेसिंग त्रुटियां नहीं हैं, इसलिए मुझे लगता है कि कुछ भी खो गया नहीं है। लेकिन यह अभी भी सवाल छोड़ देता है कि विधि कुछ भी नहीं, कई बार क्यों वापस आ जाएगी। – Carlos

+1

आपके संक्षिप्त विवरण (कोड के साथ) के बिना आपको समाधान प्रदान करना मुश्किल है। हालांकि मुझे सॉकेट के साथ अनुभव था और मैं उच्च अबास्ट्रक्शन - नेटवर्क स्ट्रीम का उपयोग करने की सिफारिश कर सकता हूं। नेटवर्क स्ट्रीम में एसिंक कॉलबैक की सभी क्षमताएं हैं जिनका आप उपयोग करना चाहते हैं। Http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.aspx और http://msdn.microsoft.com/en-us/library/system.net.sockets पर देखें। networkstream.beginwrite.aspx एचटीएच –

+0

क्या यह वही अंतर्निहित कॉल है? यह उपयोगी लगता है। साथ ही, जिस कोड का मैं जिक्र कर रहा हूं वह लिंक में है। – Carlos

उत्तर

0

मुझे यकीन है कि नहीं क्या जुड़ा हुआ उदाहरण में चल रहा है। ऐसा लगता है कि एक तुल्यकालिक तरीके से एसिंक्रोनस सॉकेट का उपयोग करना प्रतीत होता है। मैं किसी भी कॉलबैक या कोड में समान नहीं देख सकता। आपको पुनर्विचार करने की आवश्यकता हो सकती है कि आपको सिंक्रोनस या एसिंक्रोनस सॉकेट की आवश्यकता है :)।

हाथ में समस्या के कारण नेटवर्क ट्रांसमिट/प्राप्त होने से पहले आपके कार्य बफर को पढ़ने/लिखने की कोशिश कर रहे हैं। Async सॉकेट में शामिल कॉलबैक कार्यक्षमता का उपयोग करने का प्रयास करें। जैसे

// This goes into your accept function, to begin receiving the data 
    socketName.BeginReceive(yourbuffer, 0, yourbuffer.Length, 
     SocketFlags.None, new AsyncCallback(OnRecieveData), socketName); 

// In your callback function you know that the socket has finished receiving data 
// This callback will fire when the receive is complete. 
private void OnRecieveData(IAsyncResult input) { 
    Socket inSocket = (Socket)input.AsyncState; // This is just a typecast 
    inSocket.EndReceive(input); 

    // Pull the data out of the socket as you already have before. 
    // state.Data.Write ...... 
} 
+0

कॉलबैक SAEA ऑब्जेक्ट्स पर इवेंट हैंडलर हैं। मैंने वास्तव में कुछ न्यूनतम व्याकरण संबंधी त्रुटियों के साथ कोड चलाया है। – Carlos

+0

क्या आपके लिए अपने रिसीवर कोड को पेस्टबिन या इसी तरह पेस्ट करना संभव है, मैंने केवल उस उदाहरण को देखा है जिस पर आप अपना आधार बना रहे हैं। – themartinmcfly