`
RicardoX
  • 浏览: 77268 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
文章分类
社区版块
存档分类
最新评论

boost,asio的async方式bind

阅读更多
用了这么久boost.asio,感觉写得实在好。

async方式比较有意思。

acceptor_.async_accept(new_connection->socket(), boost::bind(&tcp_server::handle_accept, this, new_connection, boost::asio::placeholders::error));

这个地方可以bind一个函数,这个函数可以使用任意可以参数,在bind的参数里面增加。

这个比较有意思吧,像以前写程序,一般用回调函数的方法。函数可以传递的参数是有限的,这种方式,给我们了很大的方便,使得我们不用再使用void *转来转去。

可以照自已的想法,写着方便,想传几个传几个。

呵呵,大家有没有想过,这是怎么实现的呢。

经过我对asio的代码的分析,写了一段,访照的代码,看我这个,比看asio的代码,简单多了。

template <typename Handler>
class handle_object
{
public:
    handle_object(Handler handler):Handler_(handler){}
    Handler Handler_;
    static void handle_objectCall(void *hobject)
    {
        handle_object<Handler> *p =(handle_object<Handler> *) hobject;
        p->Handler_();
    }
};
typedef void (*handle_objectCallT)(void *hobject);

class Test
{
public:
    Test()
    {
        m_Call =NULL;
    }
    template<class Handler>
    void Send(void *data,int len,Handler handler)
    {
        handle_object<Handler> *pobjet = new handle_object<Handler>(handler);
        m_Call= handle_object<Handler>::handle_objectCall;
        handlerobj = pobjet;
    }
    void Call()
    {
        m_Call(handlerobj);
    }
    void *handlerobj;
    handle_objectCallT m_Call;
};
void test(int i)
{
    printf("%d\n",i);
}
void test2(int i,int j)
{
    printf("%d,%d\n",i,j);
}

int _tmain(int argc, _TCHAR* argv[])
{
    Test t;
    t.Send(NULL,5,boost::bind(test,2));
    t.Call();
    t.Send(NULL,5,boost::bind(test2,2,3));
    t.Call();

  return 0;
}

template<class Handler>

Test::Send,Handler参数为bind进来的函数,和参数,通过实例化handle_object这个类,来保存,bind进来的函数,和参数。
handle_object有一个static函数handle_objectCall,我们通过保存这个函数的指什,后面用来调用bind的函数。

为什么通过这种方式可以达到这种效果呢,大家看看c++ template这本书。

实际上,handle_object不同的模板类型,将生成不同的static函数,所以在那里面,调用p->Handler_();

也就能调用到相应的bind函数。

写程序多动动脑筋吧,多看多想。

看了别人好的东西,要学习,不要觉得太高深了用不上,而放弃了解一些真相。

例子还是够简单的吧,再NB的代码也是多思考后,写出来的。

 

lixiaomail
2008-07-18
分享到:
评论

相关推荐

    boost asio tcp服务器的实现

    Boost.Asio库为C++程序员提供了一种高效、灵活的方式来处理网络通信,包括TCP协议。本篇文章将详细探讨如何使用Boost.Asio实现一个TCP服务器,以及涉及的关键技术点。 首先,`boost::asio`是一个强大的C++库,它...

    boost asio 最新版

    Boost.Asio依赖于其他几个Boost库,如Boost.Config、Boost.Bind等。此外,它还需要平台特定的网络API支持,例如Windows Socket API或POSIX的socket API。 ##### 1.3 编译Boost.Asio 为了使用Boost.Asio,需要先编译...

    boost::asio::serialport实现串口通信

    boost::asio::async_read_some(serial, boost::asio::buffer(buffer), boost::bind(handle_read, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); ``` 5. **关闭串口**: ...

    TCP_server___client_ASIO异步实现服务器代码_

    总结,Boost.Asio库提供了一种高效且灵活的方式来实现TCP服务器和客户端。它的异步特性使得程序能够同时处理多个连接,提高系统性能。通过理解和熟练运用这些知识,开发者可以构建出强大的网络应用程序。

    steady_timer使用

    t-&gt;async_wait(boost::bind(print, boost::asio::placeholders::error, t, count)); } } int main() { int count = 0; boost::asio::io_context io_ctx; boost::asio::steady_timer t(io_ctx, boost::asio::...

    boost1_33_1

    9. **Boost.Asio**:提供了异步I/O操作,是网络编程和低级I/O操作的强大工具,同时也对C++11的std::async和std::future提供了基础。 10. **测试工具**:Boost.Test库为C++开发者提供了单元测试框架,帮助确保代码的...

    C++ boost::asio编程-异步TCP详解及实例代码

    总结来说,Boost.Asio的异步TCP编程提供了一种高效、灵活的方式来构建网络服务。通过利用异步操作和回调机制,开发者可以创建能够处理大量并发连接的高性能服务器。在实践中,理解如何正确地组织回调逻辑和管理`io_...

    boostudp.zip

    在"boostudp.zip"这个压缩包中,我们聚焦于Boost库的一个特定部分:Boost.Asio,这是一个强大的网络通信库,它支持包括UDP(User Datagram Protocol)在内的多种网络协议。 UDP是一种无连接的、不可靠的传输协议,...

    base_socket_held2yj_ASIO_

    ASIO是Boost库的一部分,也包含在C++标准库中的std::net(自C++17起),它提供了一种异步I/O模型,使得开发者能够高效地处理并发网络通信。 描述中的"base_socket 说明实例测试,测试有效,继续学习中,一起进步,...

    boost库1.65.1源码

    11. **并发编程**:Boost.Asio是网络和并发编程的利器,提供了异步I/O和定时器,是C++11的std::async和std::future的灵感来源。 12. **测试框架**:Boost.Test库提供了一个强大的单元测试框架,可以帮助开发者编写...

    c++网络编程之二,网络编程源代码

    通过`boost::asio::ip::tcp`或`boost::asio::ip::udp`,我们可以创建TCP和UDP套接字,并使用`async_send`, `async_receive`等函数进行数据传输。 2. **Poco Network**: Poco库是另一个包含全面网络功能的C++库。它...

    UDP.zip_C++

    3. 多线程或异步处理:为了同时处理接收和发送,可能需要使用多线程或多任务处理,或者利用异步I/O机制,如Boost.Asio的async_XXX函数。 4. 错误处理:需要适当地处理网络错误,如数据包丢失、超时或格式错误。 在...

    C#Socket高并发,socket高并发解决方案,CC++源码.zip.zip

    1. **异步IO(Boost.Asio)**:Boost库中的Asio提供了一套跨平台的异步IO接口,支持IOCP和epoll等高性能机制。 2. **多线程**:利用std::thread创建和管理线程,处理并发请求。 3. **线程池(C++17 std::jthread 或 ...

    C++网络通信

    异步I/O如Boost.Asio的async_read和async_write允许在其他任务执行期间进行读写操作。 6. **实例代码** 实现一个简单的C++网络通信示例,服务器端创建监听套接字,循环接收客户端连接并打印收到的消息: ```cpp...

    udp转串口工具c++

    7. **多线程/异步处理**:为了同时处理UDP接收和串口发送,可能需要使用多线程或者异步I/O,如C++11的`std::async`和`std::future`,或者Boost.Asio库。 8. **持续监听**:程序需要持续运行,监听UDP端口并不断转发...

    流式套接字传输程序

    在C++中,可以使用Windows API的Winsock库或Boost.Asio库来处理套接字通信。流式套接字基于TCP协议,提供了一个可靠、面向连接的数据传输服务,确保数据按照发送顺序到达,并且在传输过程中不会丢失或重复。 首先,...

    C++网络编程

    6. **并发模型**:除了多线程,C++还有其他并发模型,如异步IO(AIO)、事件驱动编程(如使用Boost.Asio库),以及现代C++的并发工具如future和async。 7. **网络库的使用**:在实际开发中,常常会使用到如Poco、...

    c++网络聊天资源

    另外,还可以利用第三方库如Boost.Asio,它提供了一种统一的接口来处理同步和异步I/O,简化了多线程编程。 除此之外,为了增加聊天功能的用户体验,可能还需要实现一些高级特性,如文本格式化、表情支持、文件传输...

    用WIN32编写聊天室,包括客户端,服务器

    这些技术虽然古老但仍然有效,不过在现代的C++环境中,我们更倾向于使用线程库(如std::thread)和异步编程模型(如boost.asio或C++17的std::async)。 总结起来,这个项目提供了一个基础的聊天室实现,涵盖了TCP...

    VC++网络教程

    7. **网络库的应用**:除了Winsock,还有许多第三方库如Poco、Boost.Asio等,它们提供了更高级的功能和更易用的接口,简化了VC++的网络编程。 8. **并发和异步编程**:随着Windows API的更新,`async`和`await`...

Global site tag (gtag.js) - Google Analytics