2017-09-06 5 views
1

Dans le ZMQ_REQ/ZMQ_REPexample un tampon est initialisé, puis le message est copié à l'aide de memcpy.Comment envoyer un message ZMQ en utilisant une référence?

Plus précisément:

zmq::message_t reply (5); 
memcpy (reply.data(), "World", 5); 
socket.send (reply); 

Comment répondre au message en utilisant une référence de pointeur char?

C'est quelque chose le long des lignes de:

char* text = "Hello"; 
zmq::message_t reply(); 
socket.send (text); 
+0

Une chaîne constante (comme ' « World »' dans le premier exemple) est un tableau de caractères constants. Et comme tous les tableaux, il se désintègre en un * pointeur vers son premier élément *. Ce que vous avez dans votre deuxième exemple avec 'text', est un * pointeur vers le premier élément * du tableau contenant' 'Hello ''. Le point que j'essaie de faire est que les deux exemples sont exactement les mêmes, et vous faites exactement la même chose dans le second exemple avec 'memcpy', mais en passant la variable' text' comme second argument (et de préférence 'strlen' pour obtenir la longueur de la chaîne). –

+0

Egalement quelques mots sur la terminologie: Ce que vous avez avec 'text' n'est * pas * une référence. C'est un pointeur. Nulle part les références sont impliquées. –

+0

Enfin plus de nitpicking: '" Hello "' est un tableau de caractères * constant *. Cela signifie que vous devriez utiliser par ex. 'char const *' (ou le plus commun mais équivalent 'const char *') pour le type de 'text'. –

Répondre

2

Dans l'exemple que vous avez fourni, vous n'envoyez une référence, mais un pointeur.

Avec l'API ZMQ vous devez memcpy les données dans le tampon de message.

Vous pouvez écrire votre propre fonction enveloppe

bool send(zmq::socket_t& socket, const std::string& string) { 
    zmq::message_t message(string.size()); 
    std::memcpy (message.data(), string.data(), string.size()); 
    bool rc = socket.send (message); 
    return (rc); 
} 

bool send(zmq::socket_t& socket, const char* data) { 
    size_t size = strlen(data); // Assuming your char* is NULL-terminated 
    zmq::message_t message(size); 
    std::memcpy (message.data(), data, size); 
    bool rc = socket.send (message); 
    return (rc); 
} 

Et puis d'envoyer votre message avec quelque chose comme ceci:

char* text = "Hello"; 
send(socket, text); 
+0

La première fonction effectue une conversion implicite de 'char *' en 'std :: string', n'est-ce pas? – Greg

+0

J'ai écrit une fonction pour const char * et std :: string comme exemple afin que vous puissiez envoyer les deux. – Clonk