← index
cplusplus11.Examples/boost/asio/filesend/filesend.cpp
Source: cplusplus11.Examples/boost/asio/filesend/filesend.cpp
#include"filesend.hpp"
#include<fstream>
#include<boost/array.hpp>


bool sendFile(tcp::socket &socket, std::string filepath) {
    std::fstream file;
    file.open(filepath, std::ios::in | std::ios::binary);
    if(!file.is_open()) return false;
    size_t file_size = 0;
    file.seekg(0, std::ios::end);
    file_size = file.tellg();
    file.seekg(0, std::ios::beg);
    
    boost::system::error_code ie;
    boost::asio::write(socket, boost::asio::buffer(&file_size, sizeof(file_size)), ie);
    
    while(!file.eof()) {
        char buf[1024];
        memset(buf, 0, sizeof(buf));
        file.read((char*)buf, 1024);
        int bytes_read = file.gcount();
        if(bytes_read <= 0) break;
        boost::asio::write(socket, boost::asio::buffer(buf, bytes_read));
    }
    
    file.close();
    return true;
    
}

bool recvFile(tcp::socket &socket, std::string filepath) {
    std::fstream file;
    file.open(filepath, std::ios::out | std::ios::binary);
    if(!file.is_open()) return false;
    size_t file_size = 0;
    boost::asio::read(socket, boost::asio::buffer(&file_size, sizeof(file_size)));
    size_t file_count = 0;
    while(file_count < file_size) {
        
        char buffer[1024];
        memset(buffer, 0, sizeof(buffer));
        boost::system::error_code ecode;
        size_t buffer_size = socket.read_some(boost::asio::buffer(buffer, 1024), ecode);
        if(ecode == boost::asio::error::eof)
            break;
        else if(ecode) throw boost::system::system_error(ecode);
        
        file.write(buffer,buffer_size);
        file_count += buffer_size;
        std::cout << ".";
        
        /*
        boost::array<char, 128> ar;
        boost::system::error_code ecode;
        size_t len = socket.read_some(boost::asio::buffer(ar), ecode);
        if(ecode == boost::asio::error::eof) break;
        else if(ecode) throw boost::system::system_error(ecode);
        file.write(ar.data(), len);
        */
    }
    file.close();
    return true;
}