我正在尝试使用多个隐蔽频道交换消息。 所以,基本上,首先我需要选择我想要用于通信的频道,然后选择我想与之聊天的用户的“destination_ip”,然后选择
而processMessage()
被调用。现在,要从一个通道移动到另一个通道,我必须关闭现有连接,然后使用我想要使用的新通道打开新连接。我的代码被修改为在关闭连接后继续使用相同的通道,并且只包含您需要的东西。
#include <channelmanager.hpp>
#include <thread>
#include <iostream>
#include <boost/test/unit_test.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/lexical_cast.hpp>
#include <stdio.h>
#include <string.h>
#include <fstream>
#include <openssl/hmac.h>
struct CommunicationFixture {
CommunicationFixture() {
channelmanager.setErrorStream(&cout);
channelmanager.setOutputStream(&cout);
destination_ip = "";
channel_id = channelmanager.getChannelIDs()[0];
}
library::ChannelManager channelmanager;
vector<string> last_adapters;
string destination_ip;
string channel_id = "";
int processMessage(string message) {
if (message.compare("exit") == 0) {
channelmanager.closeConnection(destination_ip);
return 1;
}
vector<string> arguments;
boost::split(arguments, message, boost::is_any_of(" "), boost::token_compress_on);
if (arguments[0].compare("argument") == 0) {
if (arguments.size() < 2) {
cout << "Not enough arguments" << endl;
return 0;
}
string argument_list = arguments[1];
for (unsigned int i = 2; i < arguments.size(); i++) {
argument_list += " " + arguments[i];
}
channelmanager.setChannelArguments(destination_ip, argument_list);
cout << "Set channel argument to '" << argument_list << "'." << endl;
return 0;
}
if (message.compare("help") == 0) {
cout << "Help not available in chat mode. Close chat first with 'exit'" << endl;
return 0;
}
channelmanager.openConnection(destination_ip, channel_id);
channelmanager.sendMessage(destination_ip, message);
return 0;
}
int close(string destination){
cout << "closing.." << endl;
channelmanager.closeConnection(destination); //I believe i have the error because of this!
return 0;
}
};
BOOST_FIXTURE_TEST_SUITE(communication, CommunicationFixture)
BOOST_AUTO_TEST_CASE(basic_communication) {
selectAdapterId(0);
cout << "Test" << endl << endl;
printCommands();
cout << "Enter your command:" << endl;
string command;
int code = 0;
while (code != 2) {
std::getline(cin, command);
code = processCommand(command);
if (code == 1) {
// chat
cout << "chat started.." << endl;
int chatCode = 0;
while (chatCode != 1) {
std::getline(cin, message);
close(destination_ip);
chatCode = processMessage(message);
channelmanager.setErrorStream(&cout);
}
cout << "chat ended." << endl;
}
}
}
BOOST_AUTO_TEST_SUITE_END()
请注意,我认为错误是由
引起的function close()
因为没有它我没有任何错误。并且在交换一些消息之后不会立即发生错误。这是错误:
未知位置(0):致命错误:in “communication / basic_communication”:内存访问违规 地址:0x00000024:故障地址没有映射 communicationTest.cpp(325):最后一个检查点:“basic_communication” 测试条目
答案 0 :(得分:1)
当您尝试访问单元化变量时发生内存访问冲突,在本例中为channelmanager
。
我只能看到您在channelmanager
方法中初始化processMessage()
,并且在初始化channelmanager
之前您正在关闭连接:
close(destination_ip);
chatCode = processMessage(message);
您可以在processMessage()
方法之前更改初始化或不关闭它。
答案 1 :(得分:0)
内存访问冲突也称为分段错误(或段错误),在程序尝试访问不存在或无法访问的内存位置时发生。我们称之为尝试访问非法内存位置。记忆要么不存在要么我们不被允许触摸它。
如果来自用户的第一个输入是“退出”,则将调用
if (message.compare("exit") == 0) {
channelmanager.closeConnection(destination_ip);
return 1;
}
在这种情况下,destination_ip未初始化。