(Я не профессионал)
Я бы хотел, чтобы некоторые советы о том, что происходит в моем коде.
Соединение происходит с одним и тем же компьютером после получения первого файла.
После получения файла я хочу открыть его, чтобы изменить некоторую переменную в моей основной программе. Но файл считается пустым в программе. Если я остановлю программу и сразу открою файл, он будет содержать все данные, которые должны быть там (не пусты). Должен ли я делать что-то еще при закрытии выходного файла?
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;
}
}
}
Найденная проблема, файл, который я открывал с помощью load_mesh, был.obj, который ссылался на файл mtl. Файл mtl не был отправлен, поэтому он не работал.
довольно глупая ошибка
Вы слушаете порт 13. Для этого требуются административные привилегии.
Кроме того, скорее всего это не то, что вы хотите сделать, потому что это "хорошо известный служебный порт" http://en.wikipedia.org/wiki/Daytime_Protocol
Кроме того, кажется очень странным (по меньшей мере), что вы называете threadservfct();
безоговорочно в потоке. Казалось бы, это приводит к бесконечной рекурсии в лучшем случае и неопределенному ожиданию в наиболее вероятном сценарии.
threadservfct();
в теме. threadservfct();
это поток fct -> я начинаю это так, как boost::thread thrd1(&threadservfct);
Предполагается, что этот поток все время ожидает поступления нового файла и удаляет ожидающую часть основной программы.