2016-11-06 9 views
-2

Je construis un courtier MQTT maintenant. Donc, quand je reçois un paquet MQTT du client. Ce paquet est également envoyé en même temps. Je ne peux pas trouver la raison pour laquelle. Je poste mon extrait de code ci-dessous s'il vous plaît faites remarquer où je vais mal.libevent incendies envoyer quand il reçoit le paquet

static void onServEcho(struct bufferevent* bev, void* cbarg) { 
    EvBufferEvent evbuf(bev); 
    struct evbuffer *input = bufferevent_get_input(bev); 
    struct evbuffer *output = bufferevent_get_output(bev); 
    size_t len = evbuffer_get_length(input); 
    evutil_socket_t accept_fd = bufferevent_getfd(bev); 
    // Copy all the data from the input buffer to the output buffer. 
    char *data; 
    //data =(char *) malloc(len); 
    data = new char[len]; 
    // cout<<"dasd"<<data<<endl; 

    evbuffer_copyout(input, data, len); 
    // evbuf.copy_data(input, data, len); 

    char converted[len]; 
    int i; 
    for (i = 0; i < len; i++) { 
     sprintf(&converted[i * 2], "%02X", data[i]); 
     // cout<<"data is"<< data[i]<<endl; 



     */ 
    } 
    // std::stringstream stream; 
    // char packet[len]; 
    //cout << "the hex data is" << converted << "with size" << len << endl; 
    // for(i=0;i<(2*len;i=i+2) { 
    // string connect_char; 
    // connect_char.insert(0,"0x"); 
    /// connect_char.append(converted,i,2); 
    //char *buffer=static_cast<char*>(connect_char); 
    /// unsigned int buffer=strtoul(connect_char.c_str(), NULL, 16); 
    // char W = static_cast<char>(buffer); 
    // cout<<"the characterr is "<<W<<endl; 
    // } 
    //char *packet=convert(converted,20); 
    //cout<<"the packet converted is "<<packet<<endl; 
    string connect_comd; 
    //connect_comd="0x"; 
    connect_comd.insert(0, "0x"); 
    connect_comd.append(converted, 0, 2); 
    // strcpy(connect_comd,converted[0]); 
    // strcpy(connect_comd,converted[1]); 
    //unsigned int buf = strtoul(connect_comd.c_str(), NULL, 16); 
    //int buf=0x10; 
    int message_type = (ToBits(data[0]).to_ulong()); 
    // cout<<"the message type received now is"<<GET_MESSAGE(data[0])<<endl; 

    //cout << "the connectcommand is" << buf << endl; 
    cout << "the message flag received now is" << ToBits(data[0]) << endl; 
    if (GET_MESSAGE(message_type) == CONNECT) { 
     cout << "connect packet received from mqtt client" << endl; 
     ConnectPack_Parser(data, len, accept_fd); 
    } else if (GET_MESSAGE(message_type) == SUBSCRIBE) { 

     cout << "subscribe packet received from mqtt client" << endl; 
     SubscribePack_Parser(data, len, accept_fd); 
    } 

    // } 
    // hexify() 
    //evbuffer_add_buffer(output, input); 
    evbuffer_add_buffer(output, input); 
    //evbuffer_remove_buffer(input,output,len); 
    free(data); 
} 

modifier: je ne suis pas simplement poster le code pour une solution au code, mais je suis cluless quant à la façon d'éviter que envoyés depuis la fin du serveur en utilisant lib événement. la ligne 'evbuffer_add_buffer (sortie, entrée);' envoie automatiquement le paquet reçu que je peux tracer à partir du wireshark. La chose est cette ligne selon la documentation libevent est nécessaire pour une performance optimale.

+0

J'ai essayé de corriger le formatage de votre code, mais même dans ce cas, c'est un gâchis. Cette question est hors sujet, le code d'affichage et juste dire "Pourquoi ça ne marche pas" n'est pas une question acceptable – hardillb

+0

la chose utilise la librairie libevent pour la première fois et j'ai tracé le wireshark et j'ai vu que chaque fois qu'un paquet était reçu sur le serveur, ce paquet a été envoyé avec la ligne 'evbuffer_add_buffer (output, input); Je ne suis pas capable de comprendre pourquoi. Dans la documentation de libevent, il est indiqué que cette ligne doit être incluse pour un fonctionnement efficace –

+0

Désolé pour la mise en forme du code, je ne pouvais pas vraiment comprendre comment le formater mais je n'avais aucune connaissance ctrl + K pour éviter l'erreur de publication –

Répondre

0

le code fonctionne pour l'instant.Je l'affiche pour ceux qui pourraient en avoir besoin. Si vous ne voulez que l'opération de lecture, n'utilisez pas le code 'evbuffer_add_buffer (output, input)' puisque cela l'écrit instantanément sur le socket ou en d'autres termes envoie les données au client connecté afin que le paquet CONNECT soit envoyé simultanément