Я пытаюсь обмениваться сообщениями, используя несколько скрытых каналов.
Итак, в основном, сначала мне нужно выбрать канал, который я хочу использовать для общения, а затем выбрать «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()
Обратите внимание, что, я думаю, что ошибка происходит из-за
функция close ()
потому что без этого я не получаю никаких ошибок. и ошибка возникает не сразу, а после обмена некоторыми сообщениями. Вот ошибка:
неизвестное местоположение (0): фатальная ошибка: в
«communication / basic_communication»: нарушение доступа к памяти при
адрес: 0x00000024: нет сопоставления по адресу ошибки
communicationTest.cpp (325): последняя контрольная точка: тестовая запись «basic_communication»
Нарушение доступа к памяти происходит, когда вы пытаетесь получить доступ к унифицированной переменной, в этом случае channelmanager
,
Я вижу только то, что вы инициализируете channelmanager
в processMessage()
метод, и вы закрываете соединение перед инициализацией channelmanager
как это происходит в:
close(destination_ip);
chatCode = processMessage(message);
Либо вы меняете инициализацию, либо не закрываете ее до processMessage()
метод.
Нарушение доступа к памяти также называется ошибкой сегментации (или segfault), возникающей, когда программа пытается получить доступ к ячейке памяти, которая не существует или недоступна по другим причинам. Мы называем это попыткой получить доступ к незаконной ячейке памяти. Эта память либо не существует, либо нам не разрешено ее трогать.
Если первым вводом от пользователя является «выход», который будет вызывать
if (message.compare("exit") == 0) {
channelmanager.closeConnection(destination_ip);
return 1;
}
В этом случае destination_ip не инициализируется.