2012-06-05 17 views
11

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

// 
// Hello World server in C++ 
// Binds REP socket to tcp://*:5555 
// Expects "Hello" from client, replies with "World" 
// 
#include <zmq.hpp> 
#include <string> 
#include <iostream> 
#include <unistd.h> 

int main() { 
    // Prepare our context and socket 
    zmq::context_t context (1); 
    zmq::socket_t socket (context, ZMQ_REP); 
    socket.bind ("tcp://*:5555"); 

    while (true) { 
     zmq::message_t request; 

     // Wait for next request from client 
     socket.recv (&request); 
     std::cout << "Received Hello" << std::endl; 

     // Do some 'work' 
     sleep (1); 

     // Send reply back to client 
     zmq::message_t reply (5); 
     memcpy ((void *) reply.data(), "World", 5); 
     socket.send (reply); 
    } 
    return 0; 
} 

अब मेरा प्रश्न: मैं socket.recv() के वास्तविक डेटा को कैसे एक्सेस/पढ़ सकता हूं? कोशिश कर रहा है:

std::cout << request << std::endl; 

एक त्रुटि संदेश के परिणामस्वरूप:

error: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = 
std::char_traits<char>](((std::basic_ostream<char, std::char_traits<char> >&) 
(& std::cout)), ((const char*)"Received Hello")) << request’ 

एक ही ग्राहक के पक्ष कि संदेश दे रहा है के लिए चला जाता है। मैं वास्तविक संदेश को प्रदर्शित करने का रास्ता मिल नहीं है ...

+0

मेरा मानना ​​है कि ZeroMQ प्रलेखन सी ++ में उदाहरण है। क्या आपने उन पर देखा है? – larsks

+1

आप सही हैं, zmq_msg_data के लिए एक प्रविष्टि है जो कहती है "zmq_msg_data() फ़ंक्शन संदेश द्वारा संदर्भित संदेश ऑब्जेक्ट की संदेश सामग्री में एक सूचक लौटाएगा।" लेकिन मैं इसे स्पष्ट रूप से कैसे करूं? – dhpizza

+0

नहीं, मेरा मतलब है [गाइड] (http://zguide.zeromq.org/) सी ++ कोड उदाहरणों से भरा है। – larsks

उत्तर

33

हैलो दुनिया उदाहरण केवल आधे रास्ते चला जाता है और हार्ड-कोडेड मूल्यों आउटपुट:

std::cout << "Received Hello" << std::endl; 

वास्तविक प्रतिक्रिया मुद्रण के रूप में किया जा सकता है निम्नानुसार है:

zmq::message_t reply; 
socket.recv (&reply); 

std::string rpl = std::string(static_cast<char*>(reply.data()), reply.size()); 

std::cout << rpl << std::endl; 

zhelpers.hpp में कुछ अन्य उपयोगी उदाहरण हैं।

+0

अच्छा पहला जवाब @ निकोलईकौडेलिया। – thomasfedb

+0

क्या आप किसी भी बाध्यकारी के बिना zmq (cppzmq) या zmq के सी बाध्यकारी का उपयोग कर रहे हैं? –

+0

हां, बाध्यकारी (zmq.hpp) की आवश्यकता है। –

2

मैंने पाया निम्नलिखित करता है कि मैं क्या चाहते हैं:

zmq::message_t request (msglen); 
memcpy ((void *) request.data(), myMessage, msglen); 
char * requestmsg = new char [msglen]; 
memcpy (requestmsg, request.data(), request.size()); 
requestsocket.send (request); 
std::cout << "Sending " << requestmsg << std::endl; 

जहां msglen प्रकार int की है और myMessage स्थिरांक चार * tyoe है। इस तरह, सर्वर को एक मानव पठनीय संदेश प्राप्त होता है। आशा है कि यह किसी भी ज़ीरोम नियमों के खिलाफ नहीं है ...

+1

चूंकि आप सी ++ में हैं क्यों स्ट्रिंग का उपयोग नहीं करते? मेरा मतलब है कि char * केवल दर्द होता है जब तक आपको वास्तव में कुछ अस्पष्ट कारणों (उदाहरण के लिए अन्य पुस्तकालय) के लिए उनकी आवश्यकता नहीं होती है। – Void

1

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

zmq::message_t request; 
    socket.recv (&request); 
    std::cout << "Received request: [" << (char*) request.data() << "]" << std::endl; 
    // Do some 'work' 
    Sleep (1); 
    // Send reply back to client 
    zmq::message_t reply (6); 
    memcpy ((void *) reply.data(), "World", 6); 
    socket.send (reply); 

हालांकि, इस समाधान प्राप्त डेटा की लंबाई निर्दिष्ट नहीं करता है, तो निम्न निकोलाई Koudelia 'जिस तरह से ऊपर है, मैं प्राप्त डेटा के लिए कोई स्ट्रिंग:

std::cout << "Received request: [" << std::string(static_cast<char*>(request.data()), request.size()) << "]" << std::endl;