muduo源码分析之TcpServer

1.Class TcpServer:管理所有的Tcp客户连接,每个Tcp客户连接由一个类Tcpconnection管理(用来具体执行消息的收发),那么Tcpserver就是根据Accetor返回的新客户创建Tcpconnection-conn。

Tcpserver构造时接收一个由IP地址和port构成的InetAddress参数,并将此地址传给Acceptor用于接收该地址的Tcp连接。

TcpServer持有scoped_ptr<Acceptor>acceptor_用于接收Tcp请求链接,Acceport每次accept后将新连接的描述符connfd和地址peeraddr返回给使用者。 


2.Tcpserver::newConnection()主要功能就是为<connfd,peerAddr>创建一个TcpConnection管理该Tcp客户连接,加入map进行统一管理,并向TcpConnection中注册一下回调函数。如connectionCallback主要是在TcpServer中由用户指定一下连接处理函数,还有用户指定的消息处理回调(如message)等都是经过Tcpserver传给TcpConnection去执行,此外TcpServer::newConnection()还会执行TcpConnection::connectEstablished()该函数会使这个具体的TcpConnection连接对应的描述符connfd加入poll的事件表,也是通过一个Channel管理一个具体的Tcp客户连接。用户向TcpServer创建时会向Accepor注册回调;

Tcpserver::Tcpserver()->Acceptor::setNewConnetionCallback()后有新Tcp连接,接受连接,并执行回调给Tcpserver。


3.Tcpserver采用map<string,TcpConnectionPtr>管理所有的Tcp客户连接,其中string是由Tcpserver服务端地址加上一个Int构成表示TcpConnectionptr的名字。

Tcpserver中主要的回调:

(1)    ConnectionCallback:当Tcpconnection建立时调用由TcpConnection::connectEstablished()调用ConnectionCallback()用于执行用户指定的连接回调。

(2)    MessageCallback:当TcpConenction有网络消息时候执行,该函数调用过程Channel::handleEvent()->TcpConnection::handleRead()->messageCallback()。

(3)    WriteCallback由用户指定的当Tcp连接上的消息发送完毕时执行的回调。

这些函数都是用户在TcpServer创建后通过TcpServer::set*Callback系列函数注册的,当Acceptor接受一个新的客户端连接时:

Acceptor::handleRead()->TcpServer::newConnection()->TcpConnection::set*Callback()

这样完成用于指定函数的传递。在TcpConenction对应的socket事件就绪时可读/可写时由Channel::handEvent()执行这些用户指定的回调,即在TcpConnection中,通过bind()将函数传递给了TcpConnection,当Channel检测当有事件发生,会调用相应的回调函数。

TcpServer::RemoveConnection()主要功能从TcpServer中移除一个TcpConnection,但是不能直接移除,通过线程转移函数完成。(根据“oneloop per thread ”,所以每次操作涉及到Eventloop时,要判断这个Eventloop是否是本线程的,若是则同步执行函数,若不是则进行线程转移)

TcpServer::removeConenction()

EventLoop::runInLoop(bind(&TcpServer::removeConnectionInLoop)->EventLoop::runInLoop()->TcpServer::removeConnectionInLoop()






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Muduo是一个C++网络库,用于编写多线程的TCP服务器和客户端。它提供了一些连接器(connector)类,用于建立和管理TCP连接。 Muduo的连接器类主要有两个:TcpClient和TcpServer。TcpClient用于作为TCP客户端,TcpServer用于作为TCP服务器。 TcpClient类提供了一些方法来建立和管理TCP连接。例如,可以使用connect()方法来连接到服务器,使用disconnect()方法来断开连接。还可以使用send()方法发送数据,使用setConnectionCallback()方法设置连接回调函数,以便在连接建立或断开时执行相应的操作。 TcpServer类用于创建TCP服务器。它提供了一些方法来管理连接。例如,可以使用start()方法启动服务器,使用setConnectionCallback()方法设置连接回调函数,以便在有新连接建立或连接断开时执行相应的操作。 以下是一个使用Muduo连接器的示例: ```cpp #include <muduo/net/TcpClient.h> #include <muduo/net/EventLoop.h> #include <muduo/net/InetAddress.h> using namespace muduo; using namespace muduo::net; void onConnection(const TcpConnectionPtr& conn) { if (conn->connected()) { printf("Connected to server\n"); // 连接建立后的操作 } else { printf("Disconnected from server\n"); // 连接断开后的操作 } } int main() { EventLoop loop; InetAddress serverAddr("127.0.0.1", 8888); TcpClient client(&loop, serverAddr, "TcpClient"); client.setConnectionCallback(onConnection); client.connect(); loop.loop(); return 0; } ``` 这个示例演示了如何使用TcpClient类连接到服务器,并在连接建立或断开时执行相应的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值