2013-03-05 3 views
5

मेरे पास एक WinRT एप्लिकेशन है जो StreamSocket और DataWriter का उपयोग करके अपलोड करता है। यह अपलोड करने का समय ट्रैक करता है और फिर थ्रूपुट की गणना करता है।WinRT StreamSockets के साथ पैकेट अपलोड पुष्टिकरण कैसे प्राप्त करें?

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

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

क्या नेटवर्क परत पर कब और कितने बाइट्स वास्तव में भेजे गए हैं, इस ढांचे से पुष्टि प्राप्त करने का कोई तरीका है?

अद्यतन: मैंने @ पोल्कडुरन के सुझावों को एक प्रयास दिया, और जब उन्होंने कुछ पैकेट नुकसान को कम करने में मदद की, तब भी मुझे छोटी फ़ाइल अपलोड (100 केबी) में महत्वपूर्ण पैकेट नुकसान का सामना करना पड़ रहा है। बड़ी फ़ाइलों (4 एमबी और 10 एमबी) के लिए, सभी पैकेट भेजे जा रहे हैं, लेकिन अंत समय अभी भी कुछ सेकंड से बंद है, जो थ्रूपुट गणना को महत्वपूर्ण रूप से स्कूज़ करता है (जब वायरशर्क निशान की तुलना में)। मेरा अनुमान है कि वास्तविक पैकेट अपलोड पुष्टिकरण प्रदान करने के बजाए कॉलबैक ने अपलोड को थोड़ा धीमा कर दिया है।

मैं अभी भी इस मुद्दे का समाधान ढूंढ रहा हूं।

संपादित करें: मैंने इस मुद्दे के बारे में माइक्रोसॉफ्ट के साथ एक समर्थन टिकट बनाया है। उनकी आधिकारिक प्रतिक्रिया यह है कि WinRT ढांचे में यह पुष्टि करने का कोई तरीका नहीं है कि एक पैकेट वास्तव में अपलोड किया गया है।

उत्तर

2

मैंने कोशिश नहीं की है, लेकिन आप DataWriterStoreOperationDataWritter वस्तु की StoreAsync विधि द्वारा लौटाए में Completed कॉलबैक संपत्ति के लिए कोई हैंडलर असाइन कर सकते हैं।

या

आप अपने StreamSocket जो एक IAsyncOperationWithProgress आपरेशन लौटने से OutputStream संपत्ति से सीधे WriteAsync विधि का उपयोग कर सकते हैं।

+1

हाँ! आपका पहला सुझाव समाधान था। मैं प्रत्येक पैकेट भेजने के लिए लौटाए गए 'DataWriterStoreOperation' ऑब्जेक्ट के' पूर्ण 'कॉलबैक का उपयोग करने में सक्षम था और उन्हें लूप में भेजने के बजाय स्वयं को कॉल करता था। कॉलबैक फ़ंक्शन में पास किए गए 'IAsyncOperation ' पैरामीटर में 'GetResults' नामक एक विधि है जो आपको बाइट भेजती है। यही वह है जिसकी तलाश में मैं हूं। आपका बहुत बहुत धन्यवाद! यह मेरे लिए एक जबरदस्त मदद थी। – jokeefe

+0

दुर्भाग्यवश, मैंने बहुत जल्द बात की। इन समाधानों में से कोई भी वास्तव में समस्या को पूरी तरह से ठीक नहीं करता है। मेरे पहले परीक्षण में, मैंने इसे HTTP अपलोड कार्यान्वयन में उपयोग किया था, इसलिए कोड वास्तव में समाप्त होने से पहले सर्वर से 200 ओके प्राप्त करने का इंतजार कर रहा था, जिसने इसे पूर्णकालिक प्रतीक्षा करने के लिए मजबूर किया। एक एफ़टीपी अपलोड में इसे लागू करने का प्रयास करने के बाद, जब मैंने छोटे फ़ाइल आकार (100 केबी) अपलोड किए, तो सर्वर को वास्तव में सभी पैकेट प्राप्त होने से पहले पूर्ण अपलोड समाप्त करना जारी रखा। मुझे लगता है कि यह सब कुछ धीमा हो गया था, लेकिन यह सच पैकेट अपलोड पुष्टिकरण नहीं है। – jokeefe

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