/* * - Sends a message to tell receiver a file is coming. * - Then sends a stream of bytes until the entire file * has been sent. * - Sends in binary mode which works for either text or binary. */ bool MsgClient::sendFile(const std::string& filename, Socket& socket) { // assumes that socket is connected std::string fqname = "../TestFiles/" + filename; FileSystem::FileInfo fi(fqname); size_t fileSize = fi.size(); std::string sizeString = Converter<size_t>::toString(fileSize); FileSystem::File file(fqname); file.open(FileSystem::File::in, FileSystem::File::binary); if (!file.isGood()) return false; HttpMessage msg = makeMessage(1, "", "localhost::8080"); msg.addAttribute(HttpMessage::Attribute("file", filename)); msg.addAttribute(HttpMessage::Attribute("content-length", sizeString)); sendMessage(msg, socket); const size_t BlockSize = 2048; Socket::byte buffer[BlockSize]; while (true) { FileSystem::Block blk = file.getBlock(BlockSize); if (blk.size() == 0) break; for (size_t i = 0; i < blk.size(); ++i) buffer[i] = blk[i]; socket.send(blk.size(), buffer); if (!file.isGood()) break; } file.close(); return true; }
// -------------- << Sends File via socket >> ----------------- bool Sender::sendFile(const std::string & filename, Socket & socket, int fPort, int tport) { std::string fqname = filename; FileSystem::FileInfo fi(fqname); size_t fileSize = fi.size(); std::string sizeString = Converter<size_t>::toString(fileSize); std::string toPort = Converter<int>::toString(tport); std::string fromPort = Converter<int>::toString(fPort); FileSystem::File file(fqname); file.open(FileSystem::File::in, FileSystem::File::binary); if (!file.isGood()) return false; HttpMessage msg = makeMessage(1, "", "localhost::"+toPort); msg.addAttribute(HttpMessage::Attribute("file", filename)); msg.addAttribute(HttpMessage::Attribute("content-length", sizeString)); msg.addAttribute(HttpMessage::Attribute("To-Port", toPort)); msg.addAttribute(HttpMessage::Attribute("From-Port", fromPort)); sendMessage(msg, socket); const size_t BlockSize = 2048; Socket::byte buffer[BlockSize]; while (true) { FileSystem::Block blk = file.getBlock(BlockSize); if (blk.size() == 0) break; for (size_t i = 0; i < blk.size(); ++i) buffer[i] = blk[i]; socket.send(blk.size(), buffer); if (!file.isGood()) break; } file.close(); return true; }