Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как передать по IP файл? 
:(
    Опции темы
=Женек=
Дата 10.4.2012, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 548
Регистрация: 20.2.2005

Репутация: нет
Всего: 1



Господа есть задача.
В известной папке на одном компе лежит файл. Программа должна его передать на другой комп с ивзестным IP адресом, тоже в определенную папку. Если надо, то допускается установка отдельного приложения на компе приемнике файла. А в идеале хотелось бы просто расшарить эту папку.

В какую сторону смотреть? Пишу на C++ Builder, может есть какие VCL позволяющие легко решить эту задачу?

Спасибо.
PM MAIL   Вверх
Cheloveck
Дата 10.4.2012, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 1
Всего: 32





--------------------
user posted image
PM Jabber   Вверх
=Женек=
Дата 10.4.2012, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 548
Регистрация: 20.2.2005

Репутация: нет
Всего: 1



спасибо за MSDN, но хотелось бы пример кода от людей, кто уже делал это.
PM MAIL   Вверх
igorrr37
Дата 29.4.2012, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 17.12.2010

Репутация: нет
Всего: нет



на бустах писал так
client
Код

#include <iostream>
#include <fstream>
#include <string>
#include <boost/asio.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/filesystem.hpp>
#include <cinttypes>
#include <windows.h>
typedef boost::asio::ip::tcp tcp;
namespace fs = boost::filesystem3;

int main()
{
    SetConsoleOutputCP(1251);
    std::cout<<"Client is running\n";
    try{
        boost::asio::io_service io;
        tcp::socket sock(io);
        tcp::endpoint endPoint(boost::asio::ip::address::from_string("127.0.0.1"), 9090); // ip и порт сервера(принимает файл)
        boost::system::error_code ec;
        sock.connect(endPoint, ec);
        if(ec){ std::cerr << ec.message(); std::cin.get(); return __LINE__; }
        else std::cout<<"Connection established\n";
        std::cout << "Input file path\n";
        std::string filePath;
        std::getline(std::cin, filePath);
        std::ifstream ifs(filePath.c_str(), std::ios::binary);
        if(!ifs.is_open()){ std::cerr << "Can't read file\n"; std::cin.get(); return __LINE__; }
        std::uintmax_t fileSize = fs::file_size(fs::path(filePath));
        std::cout << "fileSize: " << fileSize << std::endl;
        std::size_t sentFileName = boost::asio::write(sock, boost::asio::buffer("FileName: " + fs::path(filePath).filename().string() + "\r\n"));
        std::size_t sentFileSize = boost::asio::write(sock, boost::asio::buffer("FileSize: " + boost::lexical_cast<std::string>(fileSize) + "\r\n\r\n"));
        std::uintmax_t sentFileBody = 0;
        char fileBuf[10000];
        std::size_t fileBufSize = sizeof(fileBuf);
        while(ifs)
        {
            ifs.read(fileBuf, fileBufSize);
            sentFileBody += boost::asio::write(sock, boost::asio::buffer(fileBuf, ifs.gcount()));
        }
        if(sentFileBody != fileSize){std::cerr << "write() failed\n"; std::cin.get(); return __LINE__;}
        std::cout << "sentFileName: " << sentFileName << std::endl
        << "sentFileSize: " << sentFileSize << std::endl
        << "sentFileBody: " << sentFileBody << std::endl;
        std::cout << "OK" << std::endl;
        ifs.close();
        if(sock.shutdown(tcp::socket::shutdown_both, ec))
        {
            std::cerr << "shutdown() failed: " << ec.message() << std::endl;
        }
        sock.close();
    }
    catch(std::exception const& ex)
    {
        std::cerr << "Exception: " << ex.what() << std::endl;
    }
    std::cin.get();
    return 0;
}

server
Код
#include <iostream>
#include <string>
#include <fstream>
#include <boost/asio.hpp>
#include <boost/regex.hpp>
#include <boost/lexical_cast.hpp>
#include <windows.h>
typedef boost::asio::ip::tcp tcp;

boost::smatch res;
boost::regex regFileName("FileName: *(.+?)\r\n");
boost::regex regFileSize("FileSize: *([0-9]+?)\r\n");

int main (){
    SetConsoleOutputCP(1251);
    std::cout<<"Server is running\n";
    try{
        boost::asio::io_service io;
        tcp::socket sock(io);
        boost::system::error_code ec;
        tcp::acceptor acc(io, tcp::endpoint(tcp::v4(), 9090));
        acc.accept(sock);
        std::cout << "Client has been accepted\n";
        boost::asio::streambuf sBuf;;
        std::istream istr(&sBuf);
        std::size_t l = boost::asio::read_until(sock, sBuf, boost::regex("(?:\r\n){2,}"), ec);
        if(ec){std::cerr << "read_until failed\nl = " << l <<"\n"; std::cin.get(); return __LINE__;}
        std::string headers, tmp;
        while(std::getline(istr, tmp) && tmp != "\r")
        {
            headers += (tmp + '\n');
        }
        std::cout << "Headers:\n" << headers << std::endl;
        if(!boost::regex_search(headers, res, regFileSize))
        {
            std::cerr << "regFileSize not found\n";
            std::cin.get();
            return __LINE__;
        }
        std::size_t fileSize = boost::lexical_cast<std::size_t>(res[1]);
        std::cout << "fileSize: " << fileSize << std::endl;
        if(!boost::regex_search(headers, res, regFileName))
        {
            std::cerr << "regFileName not found\n";
            std::cin.get();
            return __LINE__;
        }
        std::string fileName = res[1];
        std::cout << "fileName is " << fileName << std::endl;
        std::ofstream ofs(("c:\\" + fileName).c_str(), std::ios::binary); // файл сохраняется на диск C
        if(!ofs.is_open()){std::cerr << "Can't create file\n"; std::cin.get(); return __LINE__;}
        std::size_t len = 0;
        std::cout << "sBuf.size() = " << sBuf.size() << std::endl;
        if(sBuf.size())
        {
            len += sBuf.size();
            ofs << &sBuf;
        }
        while(len != fileSize)
        {
            len += boost::asio::read(sock, sBuf, boost::asio::transfer_at_least(1));
            ofs << &sBuf;
            std::cout << "len: " << len << std::endl;
        }
        std::cout << "OK" << std::endl;
        ofs.close();
        if(sock.shutdown(tcp::socket::shutdown_both, ec))
        {
            std::cerr << "shutdown() failed: " << ec.message() << std::endl;
        }
        sock.close();
        acc.close();
    }
    catch(std::exception const& ex)
    {
        std::cerr << "Exception: " << ex.what() << std::endl;
    }
    std::cin.get();
    return 0;
}


Это сообщение отредактировал(а) igorrr37 - 29.4.2012, 08:56
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0661 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.