2016-11-06 16 views
-2

MQTTブローカーを構築中です。libeventはパケットを受信したときに送信します

だから、私はクライアントからMQTTパケットを受信して​​います。このパケットも同時に送信されています。なぜその理由がわかりません。私は以下のコードスニペットを投稿していますが、どこが間違っているのかを指摘してください。

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); 
} 

編集: 私は、コードへの修正のためのコードを投稿していないですが、私はそれはlibのイベントを使用してサーバ側から送信避ける方法についてのclulessています。 行 'evbuffer_add_buffer(出力、入力);'私はwiresharkからトレースすることができます受信パケットを自動的に送信します。これは、最適なパフォーマンスのためにlibeventのドキュメントに必要な行です。

+0

私はあなたのコードの書式を修正しようとしましたが、それでもそれは混乱しています。この質問はトピックから外して、コードを掲示して、「なぜこの作品がどういうわけか」というのは受け入れ可能な質問ではありません。 – hardillb

+0

最初はlibeventライブラリを使用していますが、wiresharkをトレースして、サーバ上でパケットが 'evbuffer_add_buffer'(出力、入力)という行で送信されました。なぜなら理解できません。libeventのドキュメントでは、この行は効率的な操作のためにincentされなければならないと述べています。 –

+0

コードの書式設定については、実際にフォーマットする方法を理解できませんでしたが、 Kは投稿の誤りを避けるために –

答えて

0

コードは今のところ働いています。私はそれを必要とする人のために投稿しています。これは即座にソケットに書き込むか、言い換えればCONNECTパケットが同時に送信されるようにデータを送信するので、読み取り操作でのみ 'evbuffer_add_buffer(出力、入力)'コードを使用しないようにする場合

関連する問題