Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C libevent在接收数据包时激发send_C_Sockets_Libevent - Fatal编程技术网

C libevent在接收数据包时激发send

C libevent在接收数据包时激发send,c,sockets,libevent,C,Sockets,Libevent,我现在正在构建MQTT代理 因此,当我从客户端接收MQTT数据包时,该数据包也同时被发送。我无法找到原因。我在下面发布我的代码片段,请指出我哪里出错了 static void onServEcho(struct bufferevent* bev, void* cbarg) { EvBufferEvent evbuf(bev); struct evbuffer *input = bufferevent_get_input(bev); struct evbuffer *out

我现在正在构建MQTT代理

因此,当我从客户端接收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);
}
static void onServEcho(struct bufferevent*bev,void*cbarg){
EVBUFFEREVBUF(bev);
struct evbuffer*input=bufferevent\u get\u input(bev);
struct evbuffer*output=bufferevent\u get\u output(bev);
size\u t len=evbuffer\u get\u length(输入);
evutil_套接字_t accept_fd=bufferevent_getfd(bev);
//将所有数据从输入缓冲区复制到输出缓冲区。
字符*数据;
//数据=(字符*)malloc(len);
数据=新字符[len];

//cout代码目前正在运行。我正在为那些可能需要它的人发布它。如果您只需要读取操作,请不要使用“evbuffer\u add\u buffer”(输出,输入)'代码,因为这会立即将其写入套接字,或者换句话说,会将数据发送到连接的客户端,以便同时发送连接数据包。

我已尝试修复您的代码格式,但即使如此,它还是一团糟。这个问题与主题无关,发布代码并只是说“为什么这不起作用”这是一个不可接受的问题我是第一次使用libevent库,我跟踪了wireshark,发现每当服务器上收到一个数据包时,该数据包都是通过“evbuffer\u add\u buffer(输出,输入)”行发送的;'我不明白为什么。在libevent的文档中,它说明必须包含这一行以实现高效操作。对于代码格式,我真的不知道如何格式化它,但我不知道如何格式化它,所以使用ctrl+K以避免标记错误为
C
,但一半代码为
C++
…ar你确定你正在编译这个吗?编译器有什么错误?抱歉我给了错误的标签,代码是C++的。