tcpip에 대한 비동기 I/O에 대한 부스트 테스트를 설정하려고합니다.부스트 테스트 및 async IO : 메모리 액세스 위반 주소 : 주소 매핑 오류 없음
내 부스트 테스트 기능의 모습 (부스트 테스트를하고 실행하지 않음) 난 그냥 메인 스레드에서 실행하는 경우
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);
}
}
이제이 기능이 잘 작동 :
내 기능은 TCP의 MSG를 보내 이 :
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);
}
그것은 다음과 같은 오류와 함께 실패합니다
비동기 함수를 테스트하는 동안주의해야 할 사항이 있습니까?
내 빌드 정보는 다음과 같습니다
Platform: linux
Compiler: GNU C++ version 4.7.2
STL : GNU libstdc++ version 20120920
Boost : 1.49.0
편집 :로 다음과 같은 방식으로 그것을 수정 시도
well..but 여전히 같은 오류지고 :
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;
}
}
을
'CommunicationCoreFixture'의 기본 생성자가'c' 회원이 유효한 객체를 가리키는 지 확인합니까? –
예. 사실 내가 부품을 제거하면 언급해야합니다 : m_Socket.async_send (boost :: asio :: buffer (buffer, length), boost :: bind (& fingigcc :: TcpClient :: sendMsgToServerErrorHandler, this, boost :: asio :: placeholders :: error, boost :: asio :: placeholders :: bytes_transferred)); 문제없이 실행됩니다. –