2011-02-11 39 views
7

हम एक सीरियल पोर्ट के माध्यम से दो हाइपर-वी वीएम कनेक्ट करने की कोशिश कर रहे हैं। हाइपर-वी सीरियल पोर्ट को मेजबान सिस्टम में नामित पाइप के रूप में उजागर करता है, और नामित पाइप के सर्वर के अंत को लागू करता है। नतीजतन, उन्हें जोड़ने के लिए, हमें एक नामित पाइप क्लाइंट लिखना होगा जो दोनों वीएम से जुड़ता है, और डेटा को आगे और आगे कॉपी करता है।हाइपर-वी: नामित पाइप के माध्यम से कनेक्टिंग वीएम डेटा खो देता है

We have written such an application। दुर्भाग्य से, यह एप्लिकेशन डेटा खो देता है।

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

डेटा हानि का कारण क्या हो सकता है? नामित पाइप को इस तरह से कनेक्ट करते समय क्या सावधानी बरतनी चाहिए?

संपादित: हम समस्या को हल काम किया है kdsrv.exe का उपयोग कर। डिबगी के COM पोर्ट को एक नामित पाइप के माध्यम से उजागर किया जा रहा है, हालांकि, डिबगर अंत टीसीपी के माध्यम से केडीएसआरवी से बातचीत करता है।

उत्तर

1

डेटा हानि नामित पाइप के कारण नहीं है। यह वास्तव में COM बंदरगाहों (नकली और भौतिक) है जो डेटा खो सकता है क्योंकि वे यूएआरटी में एक छोटे बफर के साथ काम करते हैं।

नामित पाइप COM पोर्ट को लिखे गए सभी डेटा प्राप्त करता है। आपका प्रोग्राम नामित पाइप से डेटा पढ़ता है और इसे किसी अन्य नामित पाइप पर लिखता है। यह वह जगह है जहां डेटा हानि उत्पन्न हो सकती है यदि आप बहुत तेजी से लिखते हैं तो प्राप्त करने वाले COM पोर्ट के यूएआरटी डेटा हानि की ओर अग्रसर हो सकता है।

प्राप्त करने वाले पक्ष द्वारा अपेक्षित बॉड दर से अधिक होने से बचने के लिए आपको कुछ देरी जोड़ने की आवश्यकता हो सकती है।

इसके अतिरिक्त, आप अपने प्रोग्राम में ResetEvent() कॉल गायब हैं।

अपने केडी मुद्दों के लिए, आपको कनेक्शन स्ट्रिंग में resets=0 जोड़ने की आवश्यकता हो सकती है।

+0

सुझाव के लिए धन्यवाद। अग्रेषण को थ्रॉटलिंग थोड़ा सा मदद करता है; एक सादा "कॉपी foo.txt COM1:" अब सभी डेटा सफलतापूर्वक प्रेषित कर सकता है। दुर्भाग्य से, हाइपरटर्म अभी भी zmodem संचार में deadlocks, तो अभी भी डेटा हानि कहीं भी होना चाहिए। ResetEvent के लिए: जहां विशेष रूप से यह गायब है? Async IO को ReadFile और WriteFile में ईवेंट को ठीक से रीसेट करने के लिए परिभाषित किया गया है। कल रीसेट = 0 परीक्षण करेंगे। –

+0

मेरी गलती। ResetEvent की कोई आवश्यकता नहीं है। – John

+0

यह उत्तर केवल आंशिक रूप से समस्या को हल नहीं करता है। फिर भी, यह हमारे पास सबसे अच्छा जवाब है, इसलिए मैं इसे बक्षीस दे रहा हूं। इस समस्या के आसपास हमने कैसे काम किया है इसके लिए मेरा संपादन देखें। –

0

मैं सीरियल के माध्यम से वीएम कनेक्ट करने का प्रयास नहीं किया, लेकिन मैं यूएसबी (नेटवर्क के माध्यम से) के माध्यम से वीएम और होस्ट जुड़े और यह काम करता है। यदि आपके सॉफ़्टवेयर के लिए सीरियल कनेक्शन स्थापित करने की आवश्यकता है तो टीसीपी \ आईपी के माध्यम से काम के साथ धारावाहिक अनुकरणकर्ताओं के माध्यम से परीक्षण करने का प्रयास करें।

+0

प्रस्ताव के लिए धन्यवाद। दुर्भाग्यवश, असली एप्लिकेशन यहां कर्नेल डीबगर है, जो अतिथि मशीन में किसी भी प्रकार की नेटवर्किंग के साथ काम नहीं करेगा। –

0

मुझे लगता है कि जॉन का सुझाव सही है - यदि आप दो वीएम अनुकरण करने के लिए धीमी सीपीयू का उपयोग कर रहे हैं, तो सीरियल पोर्ट के लिए अतिथि ओएस के ड्राइवर उच्च गति संस्करण से बहुत दूर हो जाते हैं। तो जॉन का सुझाव सीरियल लिंक के इनपुट/आउटपुट साइड को धीमी गति से संभव गति पर सेट करना है। हां, आप अंतर-वीएम धारावाहिक संचार के लिए उच्च बॉड दर का उपयोग नहीं कर सकते हैं। इसके बजाय आपको सबसे धीमी गति से संभव गति का उपयोग करना होगा, और ताकि वीएम अतिथि चालक उस क्यू को ले ले और ड्राइवर के धीमे संस्करण का उपयोग करेगा। लेकिन धारावाहिक चालक के "अनुकरण बहाव" से बचने के लिए, आपकी भौतिक मशीन में दो वीएम चलाने के लिए पर्याप्त CPU गति होनी चाहिए।

ठीक है, बस मेरा अनुमान है, लेकिन वहाँ अपनी समस्या का एक VirtualBox संस्करण है, मालूम होता है इसे चलाने में कोई समस्या:

http://bodocsi.net/2011/02/how-setup-serial-port-link-in-virtualbox-between-two-guest-virtual-machine-in-linux/

लेकिन VirtualBox के लिए निम्नलिखित बग टिकट आपकी समस्या के लिए कई समानताएं का वर्णन करता है:

https://www.virtualbox.org/ticket/1548

और अंत पढ़ने प्रतीत होता है का संकेत मिलता है समाधान VirtualBox के आंतरिक स्रोत कोड के साथ क्या करना है। शायद यह हाइपर-वी की समस्या है?