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;