void QaSProtocolServer::serverCore()
{
boost::asio::ip::udp::socket socket(ioService,
boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(),
m_serverPort));
boost::asio::streambuf sb;
boost::asio::streambuf::mutable_buffers_type mutableBuf =
sb.prepare(sizeof(MSG_T));
size_t receivedBytes = socket.receive_from(mutableBuf, clientEndpoint);
sb.commit(receivedBytes);
std::istream is(&sb);
uint8_t msg_type;
is.read((char*)&msg_type, sizeof(msg_type));
uint64_t key;
is.read((char*)&key, sizeof(key));
sb.consume(receivedBytes);
std::ostream os(&sb);
CITE_MSG_T replyMsg;
std::vector<std::string> quoteParts;
try
{
quoteParts = prepareQuote(replyMsg);
}
catch (QaSProtocolServerException& e)
{
sendServerErrMsg(socket, clientEndpoint);
return;
}
uint16_t index = 0;
replyMsg.msg_id = 2;
replyMsg.key = key;
replyMsg.text.data = NULL;
BOOST_FOREACH(std::string quotePart, quoteParts)
{
replyMsg.index = htons(index++);
if (replyMsg.text.data != NULL)
{
delete[] replyMsg.text.data;
}
replyMsg.text.data = new char[quotePart.size()];
strcpy(replyMsg.text.data, quotePart.c_str());
replyMsg.text.data_length = strlen(replyMsg.text.data);
qDebug() << replyMsg.text.data_length;
os.write((char*)&replyMsg,
sizeof(replyMsg) - sizeof(replyMsg.text.data));
os.write(replyMsg.text.data, strlen(replyMsg.text.data));
size_t sent_bytes = socket.send_to(sb.data(), clientEndpoint);
sb.consume(sent_bytes);
}
socket.close();
}