मैं दो अनुप्रयोगों के बीच धारावाहिक डेटा संरचनाओं को भेजने के लिए एक बाइट स्ट्रीम के रूप में डेटा भेजने के लिए कॉन्फ़िगर नामित पाइप्स का उपयोग कर रहा हूं। Serialized डेटा आकार में काफी नाटकीय रूप से बदलता है। भेजने की तरफ, यह कोई समस्या नहीं है, मैं बिल्कुल भेजने के लिए बाइट्स की संख्या समायोजित कर सकता हूं।नामित पाइप्स, रीडिंग साइड पर पढ़ने के लिए बाइट्स की सटीक संख्या को कैसे जानें। सी ++, विंडोज
मैं प्राप्त करने के लिए बाइट्स की सटीक संख्या को प्राप्त करने (पढ़ने) अंत में बफर कैसे सेट कर सकता हूं? क्या यह जानने का कोई तरीका है कि भेजने (लेखन) पक्ष पर डेटा कितना बड़ा है?
मैंने PeekNamedPipe को देखा है, लेकिन यह कार्य बाइट टाइप किए गए नामित पाइप के लिए बेकार दिखाई देता है?
lpBytesLeftThisMessage [बाहर, वैकल्पिक] एक चर कि इस संदेश में शेष बाइट्स की संख्या प्राप्त करने के लिए एक सूचक। यह पैरामीटर बाइट-टाइप नामित पाइप या अज्ञात पाइप के लिए शून्य होगा। यदि कोई डेटा पढ़ा नहीं जाता है तो यह पैरामीटर न्यूल हो सकता है।
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365779(v=vs.85).aspx
एक ऐसी स्थिति के लिए सबसे अच्छा कैसे निपटता है अगर आपको सटीक आवश्यक बफर आकार निर्धारित नहीं कर सकता?
भेजा जा रहा है कोड
string strData;
strData = "ShortLittleString";
DWORD numBytesWritten = 0;
result = WriteFile(
pipe, // handle to our outbound pipe
strData.c_str(), // data to send
strData.length(), // length of data to send (bytes)
&numBytesWritten, // will store actual amount of data sent
NULL // not using overlapped IO
);
पढ़ना कोड:
DWORD numBytesToRead0 = 0;
DWORD numBytesToRead1 = 0;
DWORD numBytesToRead2 = 0;
BOOL result = PeekNamedPipe(
pipe,
NULL,
42,
&numBytesToRead0,
&numBytesToRead1,
&numBytesToRead2
);
char * buffer ;
buffer = new char[numBytesToRead2];
char data[1024]; //1024 is way too big and numBytesToRead2 is always 0
DWORD _numBytesRead = 0;
BOOL result = ReadFile(
pipe,
data, // the data from the pipe will be put here
1024, // number of bytes allocated
&_numBytesRead, // this will store number of bytes actually read
NULL // not using overlapped IO
);
बफर उपरोक्त कोड में PeakNamedPipe समारोह के रूप में आकार 0 की हमेशा होता है सब numBytesToRead चर के लिए 0 देता है। क्या इस बफर आकार को बिल्कुल सेट करने का कोई तरीका है? यदि नहीं, ऐसी स्थिति को संभालने का सबसे अच्छा तरीका क्या है? किसी भी मदद के लिए धन्यवाद!
एक साधारण दृष्टिकोण पहली डेटा लंबाई लिखने के लिए है, तो है। रिसीवर तो पहले लंबाई को सरल पढ़ सकता है और बफर आवंटित कर सकता है। पाइप संदेश मोड के तरीके के विपरीत नहीं है। –