void ClientConnection::receiveBody() { if (recBuffer.size() == 0) recBuffer.resize(recTotal); socket.async_receive(buffer(recBuffer.data() + recBytes, (recTotal - recBytes)), [&](boost::system::error_code ec, size_t size) { recBytes += size; if (recBytes < recTotal) { receiveBody(); } else { interpretData(); } }); }
void ClientHandler::operator()(Socket& socket_) { try { IMessage *msg = receiveHeader(socket_); if (msg->getCommand() == "send_string") Verbose::show("\nString received: " + msg->getValue() + "\n"); else if (msg->getCommand() == "file_upload") { using HighResolutionClock = chrono::high_resolution_clock; HighResolutionClock::time_point t1 = HighResolutionClock::now(); if (acceptFile(msg, socket_)) { } else Verbose::show("\nFile Upload Failed!\n"); HighResolutionClock::time_point t2 = HighResolutionClock::now(); auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count(); msg->setTime(to_string(duration)); } else if (msg->getCommand() == "ack") { string s = "\n Reply from " + msg->getSendIP() + msg->getSendPort(); s += ": " + msg->getValue() + " uploaded successfully!\n"; Verbose::show(s); } else //(msg->getCommand() == "ack_get_dir") { receiveBody(socket_,msg); } recvr->postMessage(msg); } catch (std::exception& ex) { Verbose::show(" Exception caught:", always); Verbose::show(std::string("\n ") + ex.what() + "\n\n"); } socket_.shutDown(); socket_.close(); }
void ClientConnection::receiveHeader() { if (recBuffer.size() == 0) { recTotal = sizeof(MessageHeader); recBytes = 0; recBuffer.resize(recTotal); } socket.async_receive(buffer(recBuffer.data() + recBytes, (recTotal - recBytes)), [&](boost::system::error_code ec, size_t size) { recBytes += size; if (recBytes < recTotal) { receiveHeader(); } else { MessageHeader* header = reinterpret_cast<MessageHeader*>(recBuffer.data()); recBytes = 0; recTotal = header->size; recType = header->type; recBuffer.clear(); receiveBody(); } }); }