【发布时间】:2016-11-06 07:35:14
【问题描述】:
我现在正在构建 MQTT 代理。
所以,当我收到来自客户端的 MQTT 数据包时。该数据包也在同时发送。我找不到原因。我在下面发布我的代码 sn-p 请指出我哪里出错了。
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 事件从服务器端发送。 行'evbuffer_add_buffer(输出,输入);'自动发送接收到的数据包,我可以从 Wireshark 跟踪。问题是根据 libevent 文档的这条线是最佳性能所必需的。
【问题讨论】:
-
我已经尝试修复您的代码格式,但即便如此,它还是一团糟。这个问题离题了,发布代码并只是说“为什么这不起作用”不是一个可以接受的问题
-
问题是我第一次使用 libevent 库,我跟踪了 Wireshark,我看到每当在服务器上收到一个数据包时,该数据包都是通过 'evbuffer_add_buffer(output, input) 行发送的; ' 无法理解为什么。在 libevent 的文档中,它指出必须包含此行以进行有效操作
-
抱歉代码格式化,我真的不知道如何格式化,但我一无所知,所以使用 ctrl+K 以避免发布错误
-
标签是
C,但一半的代码是C++...你确定你编译对了吗?编译器显示什么错误? -
对不起,我给了错误的标签,代码在 c++ 中