2016-03-23 15 views
2
ile iletme meta verileri

zmq ve zmqpp ile, ait olduğu iletiyle birlikte meta verileri iletmenin bir yolunu arıyorum. Amaç, güvenli yuvaya sahip bir yük dengeleyicinin arkasında bir çalışanın 'Kullanıcı Kimliği' elde etmektir.zeromq/zmqpp: İleti

İşte basit bir örnek, meta verilerin iletildikten sonra kaybolduğunu görebilirsiniz. Emin değilim: Bu meta veri 'bir hata ya da bir özellik' ortadan kalkar mı? Herhangi bir geçici çözüm var mı?

#include "zmqpp/zmqpp.hpp" 
#include "zmqpp/curve.hpp" 

int main() 
{ 
    zmqpp::curve::keypair client_keypair = zmqpp::curve::generate_keypair(); 
    zmqpp::curve::keypair server_keypair = zmqpp::curve::generate_keypair(); 

    std::cout << "Client Public Key: " << client_keypair.public_key << std::endl; 
    std::cout << "Server Public Key: " << server_keypair.public_key << std::endl; 

    zmqpp::context context; 

    zmqpp::auth authenticator(context); 
    authenticator.set_verbose(false); 
    authenticator.configure_curve(client_keypair.public_key); 

    zmqpp::socket curve_rep(context, zmqpp::socket_type::rep); 
    curve_rep.set(zmqpp::socket_option::curve_server, true); 
    curve_rep.set(zmqpp::socket_option::curve_secret_key, server_keypair.secret_key); 
    curve_rep.bind("tcp://127.0.0.1:4242"); 

    zmqpp::socket curve_req(context, zmqpp::socket_type::req); 
    curve_req.set(zmqpp::socket_option::curve_server_key, server_keypair.public_key); 
    curve_req.set(zmqpp::socket_option::curve_public_key, client_keypair.public_key); 
    curve_req.set(zmqpp::socket_option::curve_secret_key, client_keypair.secret_key); 
    curve_req.connect("tcp://127.0.0.1:4242"); 

    zmqpp::socket internal_rep(context, zmqpp::socket_type::rep); 
    internal_rep.bind("inproc://clear"); 

    zmqpp::socket internal_req(context, zmqpp::socket_type::req); 
    internal_req.connect("inproc://clear"); 

    { 
     zmqpp::message msg; 
     msg << "Hello"; 
     curve_req.send(msg); 
    } 

    { 
     zmqpp::message msg; 
     curve_rep.receive(msg); 

     // read User-Id 
     std::string user_id; 
     std::cout << "- Before forward: "; 
     if (msg.get_property("User-Id", user_id)) 
      std::cout << user_id << std::endl; 
     else 
      std::cout << "No user id" << std::endl; 

     // Forward message 
     internal_req.send(msg); 
    } 

    { 
     zmqpp::message msg; 
     internal_rep.receive(msg); 

     // read User-Id 
     std::string user_id; 
     std::cout << "- After forward: "; 
     if (msg.get_property("User-Id", user_id)) 
      std::cout << user_id << std::endl; 
     else 
      std::cout << "No user id" << std::endl; 

     std::string content; 
     msg >> content; 

     std::cout << "- Message: " << content << std::endl; 
    } 

    { 
     zmqpp::message msg; 
     msg << "world !"; 
     internal_rep.send(msg); 
    } 

    { 
     zmqpp::message msg; 
     internal_req.receive(msg); 
     // Forward message 
     curve_rep.send(msg); 
    } 

    { 
     zmqpp::message msg; 
     curve_req.receive(msg); 
     std::cout << "- Message: " << msg.get<std::string>(0) << std::endl; 
    } 

    return 0; 
} 

Çıkış:

Client Public Key: }-}3(fH/r!I/9*tJX0bN/TT]Y2Qd#{IqszYzBX.g 
Server Public Key: [email protected]@e3jW)[email protected]?y9mD(QWd8 
auth: Starting ZAP Authentication Server 
- Before forward: }-}3(fH/r!I/9*tJX0bN/TT]Y2Qd#{IqszYzBX.g 
- After forward: No user id 
- Message: Hello 
- Message: world ! 
auth: Shutdown ZAP Authentication Server 

cevap

4

Bu ZMQ bir kafa elemanı da olabilir. Size atıfta bulunduğunuz meta-veri, ZMQ mesajının bir parçası değildir, bu mesajın size ulaştığı bağlantının bir parçasıdır. Bu mesajın bir özelliği olarak erişebildiğiniz gerçeği, ZMQ kablolu protokolünün bir eseridir, verilerin bir soketten diğerine nasıl aktarıldığı, alıcı soketin bu mesajı uygun şekilde işlemesi için gereken tüm bilgileri içerir. Bir ZMQ mesajında ​​"başlıklar" yoktur, sadece "çerçeveler" vardır ve ZMQ soketleri, meta verileri içerdiğinde bu çerçevelerin nasıl işleneceğini bilir.

Bu nedenle, kısa yanıt, Curve kriptosunun görüşülmesi için ayrıntıların verildiği soketlerin, kripto verileriyle birlikte kripto meta verileri göndermesinin ve kripto ayrıntıları ile ayarlanan giriş soketinin bu meta verilerle ne yapılacağını bilmesidir . Kripto'suz "normal" soketlere gönderdiğinizde, bu meta veriler sıyrılır. Yuvaların arka uç çifti kripto kullandıysa, artık ön uca uygulanan meta verilere sahip olmayacak, aracı arka uç soketine uygulanan bir Kullanıcı Kimliği olacaktır.

İletiye meta verileri eklemek için arka uçlara geri gönderilecek şekilde, doğrudan veya yeni bir mesaj çerçevesinde (çok parçalı mesaj) mesaj verisine eklemeniz gerekir. Kendiniz halledin, metadata olmayacak, artık birinci sınıf veri olacak.