я пытаюсь настроить буст-тест для асинхронного ввода-вывода для tcpip.
моя функция отправлять tcp msg:
int TcpClient::sendMsgToServer(string msg) {
if (isConnected == true) {
Logger::debug("Asynch send request for msg: " + msg, __LINE__,
__FILE__);
sendSequence++;
msg.append("\r\n");
int length = msg.length() + 2; //+2 is for \r\n
char* buffer = (char*) msg.c_str();
Logger::debug(buffer, __LINE__, __FILE__);
m_Socket.async_send(boost::asio::buffer(buffer, length),
boost::bind(&fingigcc::TcpClient::sendMsgToServerErrorHandler,
this, boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
std::string sentMsg = "Sent Msg: " + msg;
Logger::debug(sentMsg, __LINE__, __FILE__);return 0;
} else {
return -1;
}
}
void TcpClient::sendMsgToServerErrorHandler(
const boost::system::error_code& error, std::size_t bytes_transferred) {
Logger::debug("Sending complete: ", __LINE__, __FILE__);
sendResponseSequence++;
int i = error.value();
std::stringstream ss;
ss.clear();
ss << i;
Logger::debug("RESULTCODE: " + ss.str(), __LINE__, __FILE__);
if (i == 0) {
Logger::debug("RESULT: " + error.message(), __LINE__, __FILE__);
} else {
Logger::crit(error.message(), __LINE__, __FILE__);
m_Socket.close();
isConnected = false;
connectionStateChanged(isConnected);
}
}
теперь эта функция работает нормально, если я просто запускаю ее в главном потоке (не работает, выполняя буст-тест)
моя функция буст-теста выглядит так:
BOOST_AUTO_TEST_CASE( CommunicationCore_sendTcpIpMsg_test ) {
CommunicationCoreFixture f;
int compare = f.c->initializeTcpIpConnection(serverAddress, serverPort); // i initialize the connection here. runs fine with any issue
sleep(2);
compare = f.c->sendMsgToServer("IDENTIFY console-2");
BOOST_MESSAGE("Sending returned value : " << compare);
BOOST_CHECK(compare == 0);
}
и это терпит неудачу со следующей ошибкой:
Entering test case "CommunicationCore_sendTcpIpMsg_test"unknown location(0): fatal error in "CommunicationCore_sendTcpIpMsg_test": memory access violation at address: 0x01003255: no mapping at fault address
*****************Test is aborted
Что я должен знать при тестировании таких асинхронных функций?
моя информация о сборке:
Platform: linux
Compiler: GNU C++ version 4.7.2
STL : GNU libstdc++ version 20120920
Boost : 1.49.0
РЕДАКТИРОВАТЬ:
Я попытался изменить его следующим образом, но все еще получаю ту же ошибку:
int TcpClient::sendMsgToServer(string msg) {
if (isConnected == true) {
Logger::debug("Asynch send request for msg: " + msg, __LINE__,
__FILE__);
sendSequence++;
msg.append("\r\n");
char *buffer = new char[msg.size() + 1];
buffer[msg.size()] = 0;
memcpy(buffer, msg.c_str(), msg.size());
Logger::debug(buffer, __LINE__, __FILE__);
m_Socket.async_send(boost::asio::buffer(buffer, (msg.size() + 1)),
boost::bind(&fingigcc::TcpClient::sendMsgToServerErrorHandler,
this, boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
std::string sentMsg = "Sent Msg: " + msg;
Logger::debug(sentMsg, __LINE__, __FILE__);return 0;
} else {
return -1;
}
}
m_Socket.async_send(boost::asio::buffer(buffer, length)
— но msg
объект является локальным, и его c_str()
результат становится недействительным после msg
выходит за рамки! Таким образом, вы на самом деле передать временный буфер асинхронной операции. Буфер не переживает эту операцию, поэтому segfault неизбежен.
Других решений пока нет …