2016-04-19 1 views
5

के बीच डेटा भेजना मैं एक सी ++ सर्वर पर डेटा भेजने के लिए एक टीसीपी कनेक्शन का उपयोग कर रहा हूं। मैंने ईआई लाइब्रेरी के बारे में पढ़ा है, जब बाइनरी को डीकोडेड मूल्य को बाइनरी से बाहर करने के लिए कार्यों का एक समूह होता है। Egs, ei_decode_string, ei_decode_long और अन्य।एरलांग और सी ++

मैं इन साधारण चीजों को करने की कोशिश कर रहा हूं:
1. सॉकेट बनाएं और उससे कनेक्ट करें।

{ok, Socket} = gen_tcp:connect({127,0,0,1}, 8986, []). 

2. gen_tcp का उपयोग करें: डेटा भेजने के लिए/2 भेजें।

gen_tcp:send(Socket, term_to_binary("Stackoverflow")). 

इसलिए, मैं सर्वर पर एक स्ट्रिंग का एक बाइनरी प्रारूप भेज रहा हूं।

मेरे सर्वर, सी ++ कोड, डेटा हो जाता है और मैं जो कुछ भी ग्राहक मेरे का उपयोग कर सॉकेट तरह ei_decode_string से अधिक भेजता है पाने के लिए कोशिश कर रहा हूँ:

आदर्श रूप में, जब डीकोड मैं स्ट्रिंग, "Stackoverflow" के बाद से वापस मिलना चाहिए मैंने इसे बाइनरी से decode_as_string करने के लिए कहा। सुनिश्चित करें कि परिणामी बफर में पर्याप्त जगह थी।

char *p = (char*)malloc(sizeof(char) * 100); 
int index = 0; 
int decoded = ei_decode_string(buff, &index, p); 
cout<<"The decoded value is "<<p<<endl; 

मैं जो स्ट्रिंग भेजता हूं उसे डीकोड करने में सक्षम नहीं हूं। क्या मैं कुछ भूल रहा हूँ? यदि मैं सही दृष्टिकोण नहीं है, तो मैं डेटा को कैसे भेज सकता हूं और सर्वर पक्ष पर इसे डीकोड कर सकता हूं।

सहायता के लिए धन्यवाद!

+0

इसे समझ लिया लेकिन यह सिर्फ एक चिमटा है। मैं देख सकता हूं कि सर्वर की तरफ, मुझे एक अतिरिक्त प्रश्न चिह्न (?) प्राप्त हो रहा है और यदि मैं उस चाप को छोड़कर बफर को पास करता हूं, तो ei_decode_string ठीक काम करता है। लेकिन यकीन नहीं है, मुझे वह अतिरिक्त प्रश्न चिह्न क्यों मिल रहा है (?)। – listen

+0

मुझे लगता है कि 'binary_to_list (term_to_binary (" Stackoverflow ") के समान कारण मानते हैं) ' – Lol4t0

+1

अपेक्षित, स्पष्ट उत्तर के लिए काम नहीं करता है: यदि कोई स्ट्रिंग को उस स्ट्रिंग के वर्णों का प्रतिनिधित्व करने वाली बाइनरी में परिवर्तित करना चाहता है, तो एक ['list_to_binary/1'] (http://erlang.org/doc/man/erlang.html#list_to_binary-1) का उपयोग करना चाहिए। 'term_to_binary' का उपयोग तब किया जाना चाहिए जब प्राप्तकर्ता [Erlang बाहरी टर्म प्रारूप] (http://erlang.org/doc/apps/erts/erl_ext_dist.html) में डेटा की अपेक्षा करता है। –

उत्तर

0
1> term_to_binary("Stackoverflow"). 
<<131,107,0,13,83,116,97,99,107,111,118,101,114,102,108, 
    111,119>> 

यहाँ बाइनरी में पहला आइटम छोटे पूर्णांक के रूप में स्ट्रिंग, लेकिन एक संस्करण संख्या (131) External Term Format में वर्णित के रूप में नहीं है। इसके बाद प्रत्येक शब्द एक टैग और फिर संबंधित डेटा द्वारा उपसर्ग किया जाता है। इस मामले में 107 STRING_EXT, लंबाई के लिए दो बाइट्स (13) और फिर 13 8 बिट पूर्णांक टैग करें, पहला 83 83 अक्षर 'एस' (83 में एसीआईआई) से मेल खाता है।

इस द्विआधारी को संभालने के लिए सही ढंग से सही ढंग से, ei_decode_version करने के लिए कॉल करने से पहले ei_decode_string

पूर्णांक ei_decode_version (स्थिरांक चार * buf, int * सूचकांक, int * संस्करण)

इस समारोह संस्करण डीकोड हो गया है erlang बाइनरी शब्द प्रारूप के लिए जादू संख्या। यह एक बाइनरी शब्द में पहला टोकन होना चाहिए।