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();
		}
	});
}