【发布时间】:2017-09-17 15:37:37
【问题描述】:
我正在使用 boost::asio 来实现一个 tcp 服务器和客户端。 当文件很大时,我正在使用写入和读取功能,写入挂起并且没有完成。
这是读取的函数
int send_request(std::string &ep_ip, int ep_port, std::string &message, std::string &response) {
boost::asio::io_service io_service;
boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string(ep_ip), ep_port);
try {
boost::asio::ip::tcp::socket socket(io_service);
boost::system::error_code error;
socket.connect(ep);
std::vector<char> buf(BUF_SIZE);
// buf = new std::vector<char>(BUF_SIZE);
std::copy(message.begin(), message.end(), buf.begin());
boost::asio::write(socket, boost::asio::buffer(buf), error);
// int bytes_read = socket.read_some(boost::asio::buffer(buf) , error );
int bytes_read = boost::asio::read(socket, boost::asio::buffer(buf), error);
std::copy(buf.begin(), buf.begin() + bytes_read, std::back_inserter(response));
socket.close();
} catch (std::exception &e) {
// std::cerr << e.what() << std::endl;
return 0;
}
return 1;
}
这是写的函数
void listen(int port_no, std::string &filename) {
boost::asio::io_service io_service;
std::string result = "";
tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), port_no));
while (1) {
tcp::socket socket(io_service);
std::vector<char> buf(BUF_SIZE);
boost::system::error_code ignored_error, error;
acceptor.accept(socket);
int req_bytes_read = socket.read_some(boost::asio::buffer(buf), error);
std::string request;
std::copy(buf.begin(), buf.begin() + req_bytes_read, std::back_inserter(request));
request = clean_string(request);
if (error) {
std::cout << "[ERROR] Unable to process the request. CODE " << error << std::endl;
} else {
std::cout << "Received the message: " << request << std::endl;
// This where we do some processing of the request, perhaps call grep.
std::string PATH = "$HOME/" + filename;
result = "";
grep_impl(request, PATH, result);
// result = grep(request , PATH);
}
std::cout << "Size of result is " << result.size() << std::endl;
boost::asio::write(socket, boost::asio::buffer(result), ignored_error);
socket.close();
}
}
【问题讨论】:
-
what 文件的大小?您没有阅读任何文件
-
所以 grep_impl 在 result 中放入了一个大字符串。准确地说是38mb
-
我已经更新了我的答案(你为什么不拿示例代码并修改它以显示问题?)
标签: c++ sockets boost boost-asio