使用BOOST的asio库连接服务器发生内存泄露问题,附代码~~~
以下代码可在vs2008下编译通过,其中61.135.169.125为百度网站的IP地址,作为测试用。程序产生的问题在于,当用任务管理器查看程序耗占的内存时,发现耗占内存以8K,12k或者更大的数值持续增加。如果注释掉connect方法的调用,则没有内存泄露问题。因此应该Net_connector的connect方法中。但是该方法以及其调用的其它方法都没有内存分配的操作,不知道是否是asio库的使用存在什么问题。请大家提出看法,谢谢~~~~
Net_connector.h
Net_connector.cpp
main.cpp
Net_connector.h
#ifndef _NET_CONNECTOR_H
#define _NET_CONNECTOR_H
#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <memory>
#include <string>
#include <boost/date_time.hpp>
/**
* Net_connector is a class implementing asynchronous connection to remote
* location.
*/
class Net_connector {
public:
/**
* Construct Net_connector object with io_service object.
*
* @param[in] io_service boost::asio::io_service object for deadline_time
*/
Net_connector(boost::asio::io_service& io_service,
boost::asio::ip::tcp::socket& socket);
/**
* connect to specified remote location within a period time.
*
* @param[in] ip the ip address to connect
* @param[in] port the port on remote location to connect
* @param[in] seconds a period time in second
*
* @return true if successfully made connection to remote location
*/
bool connect(const std::string& ip, const unsigned short& port,
const boost::posix_time::seconds& seconds);
/** return true if the connection is established, or false. */
operator bool() const;
private:
/** asynchronous connection handler. */
void handle_connect(const boost::system::error_code& error);
/** asynchronous wait handler. */
void handle_timeout(const boost::system::error_code& error);
/** reference socket for asynchronous connection. */
boost::asio::ip::tcp::socket& _socket_ref;
/** deadline_timer object for implementing asynchronous connection. */
boost::asio::deadline_timer _dealine_timer;
/** time point to computing time period for specified operation. */
//std::chrono::system_clock::time_point _last_time_point;
/** flag indicates whether or not connection is made with a period time. */
bool _connected;
/** mechanism for implementing asynchronous connection. */
boost::mutex _mutex;
boost::condition_variable _cond_var;
};
#endif // _NET_CONNECTOR_Net_connector.cpp
#include "Net_connector.h"
#include <boost/lexical_cast.hpp>
#include <boost/bind.hpp>
Net_connector::Net_connector(boost::asio::io_service& io_service,
boost::asio::ip::tcp::socket& socket)
: _socket_ref(socket)
, _dealine_timer(io_service)
, _connected(false)
{
}
bool Net_connector::connect(const std::string& ip, const unsigned short& port,
const boost::posix_time::seconds& seconds)
{
boost::mutex::scoped_lock lock(_mutex);
boost::asio::ip::tcp::endpoint endpoint(
boost::asio::ip::address::from_string(ip), port);
_connected = false;
_dealine_timer.expires_from_now(seconds);
_dealine_timer.async_wait(boost::bind(&Net_connector::handle_timeout,
this, boost::asio::placeholders::error));
_socket_ref.async_connect(endpoint,
boost::bind(&Net_connector::handle_connect, this,
boost::asio::placeholders::error));
_cond_var.wait(lock);
return _connected;
}
void Net_connector::handle_connect(const boost::system::error_code& error)
{
if (boost::asio::error::operation_aborted == error) {
return;
}
if (!error) {
_connected = true;
}
_dealine_timer.cancel();
}
void Net_connector::handle_timeout(const boost::system::error_code& error)
{
boost::mutex::scoped_lock lock(_mutex);
// timeout, cancel asynchronous connect operation
if (boost::asio::error::operation_aborted != error) {
boost::system::error_code ec;
_socket_ref.close(ec);
}
_cond_var.notify_one();
}
Net_connector::operator bool() const
{
return _connected;
}main.cpp
#include "Net_connector.h"
#include <boost/thread.hpp>
void run_service(boost::asio::io_service& io_service)
{
io_service.run();
}
int main(int, char**)
{
boost::asio::io_service io_service;
boost::asio::io_service::work work(io_service);
boost::thread t(run_service, boost::ref(io_service));
while (true) {
boost::asio::ip::tcp::socket socket(io_service);
boost::system::error_code ec;
Net_connector connector(io_service, socket);
if (!connector.connect("61.135.169.125", 80, boost::posix_time::seconds(5))) {
std::cout << "failed to connect server" << std::endl;
}
socket.shutdown(boost::asio::ip::tcp::socket::shutdown_send, ec);
socket.close(ec);
}
return 0;
}
...全文
相关推荐
Boost_asio权威傻瓜教程
- 使用`connect`方法尝试连接到服务器。 - 连接成功后,与服务器进行阻塞式的通信。#### 三、同步方式的示例代码分析接下来,我们详细分析一下Boost_ASIO同步方式的示例代码。
基于boost.asio库的C++http/https web server
在这个项目中,我们看到一个使用Boost.ASIO实现的Web服务器,它同时支持HTTP和HTTPS协议,这对于创建安全的Web服务至关重要。首先,我们需要理解Boost.ASIO库的核心概念。
boost asio 服务器和客户端 TCP
Boost.Asio是Boost库的一部分,它提供了一个C++接口,用于处理I/O操作,包括网络通信。在TCP(传输控制协议)环境下,Boost.Asio可以用来构建服务器和客户端应用程序。
boost asio tcp服务器的实现
总的来说,实现一个`boost::asio`的TCP服务器需要掌握网络编程的基本概念,理解TCP协议的工作原理,熟悉Boost.Asio库的使用,特别是异步I/O操作。
c++ boost asio http get post请求
在C++编程中,Boost库是一个非常重要的工具集,它为C++标准库提供了许多扩展功能,其中包括Boost.Asio库。


工具平台和程序库
