2011-03-28 9 views
5

मैंने नेटवर्क प्रोग्रामिंग के बीजी के परिचय को पढ़ा है लेकिन एक विषय अभी भी संदिग्ध है: डेटा encapsulation।
मूल रूप से मैं एक संरचना बनाता हूं जिसमें डेटा लंबाई और एक संदेश होता है। उदाहरण के लिए:डेटा (नेटवर्क प्रोग्रामिंग)

struct Data 
{ 
    int length; 
    std::string message; 
} 

मैं इसे कैसे भेज सकता हूं? send() फ़ंक्शन के साथ, मैं केवल char * प्रकार के चर भेज सकता हूं।
साथ ही, जब मैं इसे सर्वर पर भेजता हूं, तो क्या मुझे encapsulation द्वारा निर्दिष्ट लंबाई का गतिशील बफर बनाना चाहिए और इसमें संदेश पैक करना चाहिए?

+1

जिस विषय पर आप ठोकर खा रहे हैं वह "क्रमबद्धता" है, न कि encapsulation। – tenfour

+0

+1 सी ++ तरीके से इसे कैसे करें इस पर उत्सुक है। आपको यह भी पूछना चाहिए कि क्या आपको एंडियन मुद्दों के बारे में चिंता करना है या नहीं। – Jeff

उत्तर

2

सी ++ में आम दृष्टिकोण उन कार्यों को प्रदान करना है जो आपके कस्टम प्रकार को 'स्ट्रीम' ऑब्जेक्ट में क्रमबद्ध कर सकते हैं, और फिर स्ट्रीम में जमा किए गए डेटा ब्लॉक की शुरुआत में पॉइंटर प्राप्त करने का एक तरीका प्रदान करते हैं।

इस का एक सरल उदाहरण एसटीडी है :: ostringstream जो आप एक धारा में डेटा को क्रमानुसार और उसके बाद करने के लिए उपयोग कर सकते हैं का निर्माण स्ट्रिंग के लिए एक सूचक मिलती है:

int i = 13; 
std::string message = "Hi"; 
std::ostringstream stream; 
stream << i << message; 

cout << stream.str() << endl; // prints "13Hi"; 

आप अपने Data प्रकार के लिए एक ही कर सकता है में के रूप में << और >> ऑपरेटर की उचित भार के, उपलब्ध कराने के द्वारा:

std::ostringstream &operator<<(std::ostringstream &stream, const Data &v) { 
    return stream << v.length << v.message; 
} 

std::ostringstream &operator>>(std::ostringstream &stream, Data &v) { 
    return stream >> v.length; >> v.message; 
} 

इन कार्यों का उपयोग करना, आप ऐसा कर सकता है:

0,123,
Data myData = { 13, "Hello" }; 

std::ostringstream stream; 
stream << myData; 

const std::string serializedData = stream.str(); 
send(.., serializedData.c_str(), serializedData.size() + 1, ..); 

प्राप्त आकार पर, आप एक बफर में डेटा पढ़ सकता है और फिर एक std::istringstream वस्तु का उपयोग फिर से डेटा निकालने के:

const char receivedData[ 1024 ]; 
// fill receivedData array using recv() 

std::string s = receivedData; 
std::istringstream stream(s); 
Data myData; 
stream >> myData; 

आप से पढ़ने जब तक एक सा प्राप्त डेटा बफ़र की जरूरत हो सकती धारा सफल होती है।

+0

मैं थोड़ा उलझन में हूँ। 'myData' में 'c_str()' विधि है? – Jeff

+0

@ जेफ: क्षमा करें, मैं स्ट्रीम के बाहर 'std :: string' ऑब्जेक्ट निकालने के लिए भूल गया। मैंने बस उदाहरण तय किया। –

+0

+1 अब समझ में आता है। धन्यवाद! – Jeff

0

भेजें() एक बाइट के गुणकों में किसी बाइनरी डेटा को भेजने की अनुमति देने के लिए एक char * लेता है। क्या आपने char * को कास्ट करने का प्रयास किया है?

प्राप्त होने पर आपको लंबाई की खोज करने के लिए पहले कुछ बाइट्स को अनपैक करना होगा। बेशक यह दृष्टिकोण मानता है कि प्रेषक और रिसीवर समान लम्बाई का उपयोग करते हैं। आपको संकलक को भेजे गए पैकिंग तर्कों के बारे में भी मुझे सावधान रहना चाहिए।

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