простой серверный поток для получения файла с локального ПК - файл временно пуст

0

(Я не профессионал)

Я бы хотел, чтобы некоторые советы о том, что происходит в моем коде.

Соединение происходит с одним и тем же компьютером после получения первого файла.

После получения файла я хочу открыть его, чтобы изменить некоторую переменную в моей основной программе. Но файл считается пустым в программе. Если я остановлю программу и сразу открою файл, он будет содержать все данные, которые должны быть там (не пусты). Должен ли я делать что-то еще при закрытии выходного файла?

modele_vao и modele_count являются переменными, разделяемыми основной программой (что является причиной мьютекса)

Вот код для потока:

    void threadservfct()
{

    while (1)
    {

        {
            boost::mutex::scoped_lock lk(m);

            std::wcout << "Server_thread START " << std::endl;
            boost::array<char, 1024> buf;
            size_t file_size = 0;
            boost::asio::io_service io_service;
            boost::asio::ip::tcp::acceptor acceptor(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 13));
            boost::system::error_code error;
            boost::asio::ip::tcp::socket socket(io_service);
            acceptor.accept(socket);
            boost::asio::streambuf request_buf;
            boost::asio::read_until(socket, request_buf, "\n\n");
            std::wcout << "request size:" << request_buf.size() << std::endl;
            std::istream request_stream(&request_buf);
            std::string file_path;
            request_stream >> file_path;
            request_stream >> file_size;
            request_stream.read(buf.c_array(), 2); // eat the "\n\n" 
            size_t pos = file_path.find_last_of("\\");
            if (pos != std::string::npos)
                file_path = file_path.substr(pos + 1);
            std::ofstream output_file(file_path.c_str(), std::ios_base::binary);


            if (!output_file)
            {
                std::wcout << "failed to open " << std::endl;
            }

            // write extra bytes to file
            do
            {
                request_stream.read(buf.c_array(), (std::streamsize)buf.size());
                std::wcout << __FUNCTION__ << " write " << request_stream.gcount() << " bytes" << std::endl;
                output_file.write(buf.c_array(), request_stream.gcount());
            } while (request_stream.gcount()>0);

            for (;;)
            {
                size_t len = socket.read_some(boost::asio::buffer(buf), error);
                if (len>0)
                    output_file.write(buf.c_array(), (std::streamsize)len);
                if (output_file.tellp() == (std::fstream::pos_type)(std::streamsize)file_size)
                    break; // file was received
                if (error)
                {
                    std::wcout << error << std::endl;
                    break;
                }
            }
            std::wcout << "received " << output_file.tellp() << " bytes" << std::endl;


            output_file.close();

            std::wcout << "END TRANSMISSION. Reiceived:" << file_path.c_str() << std::endl;


            std::wcout << "import new mesh" << std::endl;
            assert(load_mesh(file_path.c_str(), &modele_vao, &modele_count));
            std::wcout << "end mesh import" << std::endl;
        }

    }
}
  • 0
    Почему тег C? Кажется, это программа только на C ++.
  • 0
    да моя вина, я удалил это
Теги:
file
file-io
thread-safety
boost-thread

2 ответа

0
Лучший ответ

Найденная проблема, файл, который я открывал с помощью load_mesh, был.obj, который ссылался на файл mtl. Файл mtl не был отправлен, поэтому он не работал.

довольно глупая ошибка

0

Вы слушаете порт 13. Для этого требуются административные привилегии.

Кроме того, скорее всего это не то, что вы хотите сделать, потому что это "хорошо известный служебный порт" http://en.wikipedia.org/wiki/Daytime_Protocol

Кроме того, кажется очень странным (по меньшей мере), что вы называете threadservfct(); безоговорочно в потоке. Казалось бы, это приводит к бесконечной рекурсии в лучшем случае и неопределенному ожиданию в наиболее вероятном сценарии.

  • 0
    Спасибо за ваш ответ. Я не знаю много о различиях между портами. Какой я должен выбрать тогда? Я не понимаю, что вы имеете в виду при вызове threadservfct(); в теме. threadservfct(); это поток fct -> я начинаю это так, как boost::thread thrd1(&threadservfct); Предполагается, что этот поток все время ожидает поступления нового файла и удаляет ожидающую часть основной программы.
  • 0
    @ user3544665 просто удалите самовывоз. Вот простая модификация, которая смогла правильно получить небольшой файл для меня: paste.ubuntu.com/7656987 И почитать книгу :)
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню