try
{
boost::asio::io_service ioService;
boost::asio::ip::udp::endpoint serverEndpoint;
boost::asio::ip::udp::socket socket(ioService);
boost::asio::ip::udp::resolver resolver(ioService);
boost::asio::streambuf sb;
std::ostream os(&sb);
std::istream is(&sb);
MSG_T CITE_REQUEST_MSG;
initVariables(serverEndpoint, socket, resolver, CITE_REQUEST_MSG);
os.write((char*)&CITE_REQUEST_MSG, sizeof(CITE_REQUEST_MSG));
size_t sentBytes = socket.send_to(sb.data(), serverEndpoint);
sb.consume(sentBytes);
uint8_t msgType;
uint16_t quotePartsNumber = -1;
CITE_MSG_T replyMsg;
replyMsg.text.data = NULL;
boost::asio::streambuf::mutable_buffers_type mutableBuf =
sb.prepare(sizeof(replyMsg) + MAX_PART_SIZE);
do
{
timed_wait_on_socket(socket, (quotePartsNumber > 0),
boost::bind(&QaSProtocolClient::timeoutHandler, this, _1, _2));
size_t receivedBytes = socket.receive_from(mutableBuf,
serverEndpoint);
sb.commit(receivedBytes);
is.read((char*)&msgType, sizeof(msgType));
// sb.consume(is.gcount());
if (msgType == 0)
{
uint8_t errno_;
is.read((char*)errno_, sizeof(errno_));
sb.consume(receivedBytes);
errno = __builtin_bswap64(errno_);
throw QaSProtocolClientException("Server returned error");
}
replyMsg.msg_id = msgType;
is.read((char*)&replyMsg.key, sizeof(replyMsg.key));
is.read((char*)&replyMsg.index, sizeof(replyMsg.index));
is.read((char*)&replyMsg.parts, sizeof(replyMsg.parts));
is.read((char*)&replyMsg.text.data_length,
sizeof(replyMsg.text.data_length));
if (replyMsg.text.data != NULL)
{
delete[] replyMsg.text.data;
}
replyMsg.text.data = new char[replyMsg.text.data_length];
is.read(replyMsg.text.data, htons(replyMsg.text.data_length));
sb.consume(receivedBytes);
qDebug() << msgType << " " << replyMsg.index << " " << replyMsg.parts << " " << replyMsg.text.data_length << " "<< replyMsg.text.data;
processReply(replyMsg, quotePartsNumber);
}
while(--quotePartsNumber > 0);
delete[] replyMsg.text.data;
aggregate_result(result);
quoteParts.clear();
quotePartsNumber = -1;
}
catch(std::exception& e)
{
throw QaSProtocolClientException(e.what());
}
return result;