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的代码也是多思考后,写出来的。
相关推荐
Boost.Asio库为C++程序员提供了一种高效、灵活的方式来处理网络通信,包括TCP协议。本篇文章将详细探讨如何使用Boost.Asio实现一个TCP服务器,以及涉及的关键技术点。 首先,`boost::asio`是一个强大的C++库,它...
Boost.Asio依赖于其他几个Boost库,如Boost.Config、Boost.Bind等。此外,它还需要平台特定的网络API支持,例如Windows Socket API或POSIX的socket API。 ##### 1.3 编译Boost.Asio 为了使用Boost.Asio,需要先编译...
boost::asio::async_read_some(serial, boost::asio::buffer(buffer), boost::bind(handle_read, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); ``` 5. **关闭串口**: ...
总结,Boost.Asio库提供了一种高效且灵活的方式来实现TCP服务器和客户端。它的异步特性使得程序能够同时处理多个连接,提高系统性能。通过理解和熟练运用这些知识,开发者可以构建出强大的网络应用程序。
t->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::...
9. **Boost.Asio**:提供了异步I/O操作,是网络编程和低级I/O操作的强大工具,同时也对C++11的std::async和std::future提供了基础。 10. **测试工具**:Boost.Test库为C++开发者提供了单元测试框架,帮助确保代码的...
总结来说,Boost.Asio的异步TCP编程提供了一种高效、灵活的方式来构建网络服务。通过利用异步操作和回调机制,开发者可以创建能够处理大量并发连接的高性能服务器。在实践中,理解如何正确地组织回调逻辑和管理`io_...
在"boostudp.zip"这个压缩包中,我们聚焦于Boost库的一个特定部分:Boost.Asio,这是一个强大的网络通信库,它支持包括UDP(User Datagram Protocol)在内的多种网络协议。 UDP是一种无连接的、不可靠的传输协议,...
ASIO是Boost库的一部分,也包含在C++标准库中的std::net(自C++17起),它提供了一种异步I/O模型,使得开发者能够高效地处理并发网络通信。 描述中的"base_socket 说明实例测试,测试有效,继续学习中,一起进步,...
11. **并发编程**:Boost.Asio是网络和并发编程的利器,提供了异步I/O和定时器,是C++11的std::async和std::future的灵感来源。 12. **测试框架**:Boost.Test库提供了一个强大的单元测试框架,可以帮助开发者编写...
通过`boost::asio::ip::tcp`或`boost::asio::ip::udp`,我们可以创建TCP和UDP套接字,并使用`async_send`, `async_receive`等函数进行数据传输。 2. **Poco Network**: Poco库是另一个包含全面网络功能的C++库。它...
3. 多线程或异步处理:为了同时处理接收和发送,可能需要使用多线程或多任务处理,或者利用异步I/O机制,如Boost.Asio的async_XXX函数。 4. 错误处理:需要适当地处理网络错误,如数据包丢失、超时或格式错误。 在...
1. **异步IO(Boost.Asio)**:Boost库中的Asio提供了一套跨平台的异步IO接口,支持IOCP和epoll等高性能机制。 2. **多线程**:利用std::thread创建和管理线程,处理并发请求。 3. **线程池(C++17 std::jthread 或 ...
异步I/O如Boost.Asio的async_read和async_write允许在其他任务执行期间进行读写操作。 6. **实例代码** 实现一个简单的C++网络通信示例,服务器端创建监听套接字,循环接收客户端连接并打印收到的消息: ```cpp...
7. **多线程/异步处理**:为了同时处理UDP接收和串口发送,可能需要使用多线程或者异步I/O,如C++11的`std::async`和`std::future`,或者Boost.Asio库。 8. **持续监听**:程序需要持续运行,监听UDP端口并不断转发...
在C++中,可以使用Windows API的Winsock库或Boost.Asio库来处理套接字通信。流式套接字基于TCP协议,提供了一个可靠、面向连接的数据传输服务,确保数据按照发送顺序到达,并且在传输过程中不会丢失或重复。 首先,...
6. **并发模型**:除了多线程,C++还有其他并发模型,如异步IO(AIO)、事件驱动编程(如使用Boost.Asio库),以及现代C++的并发工具如future和async。 7. **网络库的使用**:在实际开发中,常常会使用到如Poco、...
另外,还可以利用第三方库如Boost.Asio,它提供了一种统一的接口来处理同步和异步I/O,简化了多线程编程。 除此之外,为了增加聊天功能的用户体验,可能还需要实现一些高级特性,如文本格式化、表情支持、文件传输...
这些技术虽然古老但仍然有效,不过在现代的C++环境中,我们更倾向于使用线程库(如std::thread)和异步编程模型(如boost.asio或C++17的std::async)。 总结起来,这个项目提供了一个基础的聊天室实现,涵盖了TCP...
7. **网络库的应用**:除了Winsock,还有许多第三方库如Poco、Boost.Asio等,它们提供了更高级的功能和更易用的接口,简化了VC++的网络编程。 8. **并发和异步编程**:随着Windows API的更新,`async`和`await`...