C++ asio写入成功,但未发送信息
我在创建发送请求的客户端程序时遇到问题。请求正在使用保持活动状态的TCP HTTP连接。当连接关闭时(由于超时或最大值被命中),如果没有可用的连接,我会尝试启动一个新连接,然后重新发送请求。连接工作正常,但是,当我尝试发送写入时,没有发送任何内容(根据Wireshark),但我的写入错误代码成功。接收服务器也不接收任何信息。以下是我的代码的主要部分:C++ asio写入成功,但未发送信息,c++,boost,tcp,network-programming,boost-asio,C++,Boost,Tcp,Network Programming,Boost Asio,我在创建发送请求的客户端程序时遇到问题。请求正在使用保持活动状态的TCP HTTP连接。当连接关闭时(由于超时或最大值被命中),如果没有可用的连接,我会尝试启动一个新连接,然后重新发送请求。连接工作正常,但是,当我尝试发送写入时,没有发送任何内容(根据Wireshark),但我的写入错误代码成功。接收服务器也不接收任何信息。以下是我的代码的主要部分: void request_handler::send_1(std::vector<std::string> *bid_vector,
void request_handler::send_1(std::vector<std::string> *bid_vector, std::string request_path, boost::mutex *bids_mutex)
{
try
{
boost::asio::streambuf request;
std::ostream request_stream(&request);
std::string reply_information;
request_stream << "GET /tests HTTP/1.1\r\n";
request_stream << "Host: 10.1.10.160\r\n";
request_stream << "Accept: */*\r\n";
request_stream << "Connection: keep-alive\r\n\r\n";
server1_mutex_.lock();
if(server1_available_map_.size() == 0)
{
server1_mutex_.unlock();
persistent_connection *new_connection = new persistent_connection("10.1.10.160","80");
if(new_connection->send(request, reply_information))
{
server1_mutex_.lock();
server1_available_map_[new_connection->get_id()] = new_connection;
server1_mutex_.unlock();
}
}
else
{
persistent_connection *current_connection = (*(server1_available_map_.begin())).second;
server1_available_map_.erase(current_connection->get_id());
server1_mutex_.unlock();
int retry_counter = 20;
while(!current_connection->query_rtb(request, reply_information) && --retry_counter != 0)
{
delete current_connection;
server1_mutex_.lock();
if(server1_available_map_.size() == 0)
{
server1_mutex_.unlock();
current_connection = new persistent_connection("10.1.10.160","80");
}
else
{
current_connection = (*(server1_available_map_.begin())).second;
server1_available_map_.erase(current_connection->get_id());
server1_mutex_.unlock();
}
}
//Could not connect to 20 connections
if(retry_counter == 0)
{
Log::fatal("Could not connect in 20 tries");
delete current_connection;
return;
}
server1_mutex_.lock();
server1_available_map_[current_connection->get_id()] = current_connection;
server1_mutex_.unlock();
}
bids_mutex->lock();
bid_vector->push_back(reply_information);
bids_mutex->unlock();
}
catch(boost::thread_interrupted& e)
{
std::cout << "before cancel 1" << std::endl;
return;
}
catch(...)
{
std::cout << "blah blah blah" << std::endl;
}
}
这表明第一个连接得到了文件的结尾(另一端的服务器关闭了连接)。第二个连接连接良好(连接处理程序消息),查询在第二个连接(不同id)中执行,写入显然成功,程序挂起读取(因为没有要读取的内容)
有人知道为什么会这样吗?我好像做错什么了吗
谢谢看起来您正在向多个写调用传递相同的boost::asio::streambuf
boost::asio::write(socket_, request_information, write_ec);
缓冲区的内容被第一次调用boost::asio::write消耗。这有效地清空了缓冲区,因此没有任何东西可以发送。如果要使用同一缓冲区进行多次写入,请传递常量字符串。非常感谢,就是这样,我不知道从streambuf读取是破坏性的。
DOING QUERY in 69a8f0ab-2a06-45b4-be26-37aea6d93ff2
Before write
Success
Before read
End of file
Read error: End of file
Connect handler
DOING QUERY in 4eacaa96-1040-4878-8bf5-c29b87fa1232
Before write
Success
Before read
boost::asio::write(socket_, request_information, write_ec);