当前位置: 首页 > news >正文

商业网站需要多少钱seo服务公司

商业网站需要多少钱,seo服务公司,怎么注册企业网站域名,PHP动态网站开发实训总结6简介 muduo用TcpClient发起连接,TcpClient有一个Connector连接器,TCPClient使用Conneccor发起连接, 连接建立成功后, 用socket创建TcpConnection来管理连接, 每个TcpClient class只管理一个TcpConnecction,连接建立成功后设置相应的回调函数…

简介

muduo用TcpClient发起连接,TcpClient有一个Connector连接器,TCPClient使用Conneccor发起连接, 连接建立成功后, 用socket创建TcpConnection来管理连接, 每个TcpClient class只管理一个TcpConnecction,连接建立成功后设置相应的回调函数。很显然,TcpClient用来管理客户端连接,真正连接交给Connector。

主要成员及属性解析

主要接口

回调setters

这些回调函数会在新连接建立时,通过newConnection内部实现方法传递给TcpConnction对象

核心实现:newConnection

在构造时将这个函数作为回调注册给connector_对象
在Connector中的Channel执行本回调后,创建一个新的TcpConnection对象

connect

调用Connector的start接口

stop

调用Connector的stop接口

主要成员

loop

所属workloop

connector

TcpClient所维护的一个连接器

retry_

重连标志

TcpConnection connection_

TcpClient所维护的一个TCP连接对象
关于连接中回调的传递,参考下面的简图:

eb602a687d5a49408a8209145c038271

源码剖析

代码已编写完整注释,

TcpClient.h

// Copyright 2010, Shuo Chen.  All rights reserved.
// http://code.google.com/p/muduo/
//
// Use of this source code is governed by a BSD-style license
// that can be found in the License file.// Author: Shuo Chen (chenshuo at chenshuo dot com)
//
// This is a public header file, it must only include public header files.#ifndef MUDUO_NET_TCPCLIENT_H
#define MUDUO_NET_TCPCLIENT_H#include "muduo/base/Mutex.h"
#include "muduo/net/TcpConnection.h"namespace muduo
{
namespace net
{class Connector;
typedef std::shared_ptr<Connector> ConnectorPtr;class TcpClient : noncopyable
{public:// TcpClient(EventLoop* loop);// TcpClient(EventLoop* loop, const string& host, uint16_t port);TcpClient(EventLoop* loop,const InetAddress& serverAddr,const string& nameArg);~TcpClient();  // force out-line dtor, for std::unique_ptr members.void connect();//请求连接void disconnect();//断开连接void stop();//停止连接TcpConnectionPtr connection() const{MutexLockGuard lock(mutex_);return connection_;}EventLoop* getLoop() const { return loop_; }bool retry() const { return retry_; }void enableRetry() { retry_ = true; }const string& name() const{ return name_; }/// Set connection callback./// Not thread safe.void setConnectionCallback(ConnectionCallback cb){ connectionCallback_ = std::move(cb); }/// Set message callback./// Not thread safe.void setMessageCallback(MessageCallback cb){ messageCallback_ = std::move(cb); }/// Set write complete callback./// Not thread safe.void setWriteCompleteCallback(WriteCompleteCallback cb){ writeCompleteCallback_ = std::move(cb); }private:/// Not thread safe, but in loop//新连接建立后的回调函数,将新连接封装为TcpConnection交给TcpClient来管理void newConnection(int sockfd);/// Not thread safe, but in loop释放连接void removeConnection(const TcpConnectionPtr& conn);//所属loopEventLoop* loop_;//Connector,用来处理连接阶段,ConnectorPtr connector_; // avoid revealing Connectorconst string name_;ConnectionCallback connectionCallback_;//连接回调MessageCallback messageCallback_;//消息回调WriteCompleteCallback writeCompleteCallback_;//数据发送完成回调//是否重连bool retry_;   // atomic//是否连接bool connect_; // atomic// always in loop threadint nextConnId_;mutable MutexLock mutex_;//管理连接的TcpConnectionTcpConnectionPtr connection_ GUARDED_BY(mutex_);
};}  // namespace net
}  // namespace muduo#endif  // MUDUO_NET_TCPCLIENT_H

TcpClient.cc

// Copyright 2010, Shuo Chen.  All rights reserved.
// http://code.google.com/p/muduo/
//
// Use of this source code is governed by a BSD-style license
// that can be found in the License file.// Author: Shuo Chen (chenshuo at chenshuo dot com)
//#include "muduo/net/TcpClient.h"#include "muduo/base/Logging.h"
#include "muduo/net/Connector.h"
#include "muduo/net/EventLoop.h"
#include "muduo/net/SocketsOps.h"#include <stdio.h>  // snprintfusing namespace muduo;
using namespace muduo::net;// TcpClient::TcpClient(EventLoop* loop)
//   : loop_(loop)
// {
// }// TcpClient::TcpClient(EventLoop* loop, const string& host, uint16_t port)
//   : loop_(CHECK_NOTNULL(loop)),
//     serverAddr_(host, port)
// {
// }namespace muduo
{
namespace net
{
namespace detail
{//断开连接
void removeConnection(EventLoop* loop, const TcpConnectionPtr& conn)
{loop->queueInLoop(std::bind(&TcpConnection::connectDestroyed, conn));
}void removeConnector(const ConnectorPtr& connector)
{//connector->
}}  // namespace detail
}  // namespace net
}  // namespace muduoTcpClient::TcpClient(EventLoop* loop,const InetAddress& serverAddr,const string& nameArg): loop_(CHECK_NOTNULL(loop)),connector_(new Connector(loop, serverAddr)),name_(nameArg),connectionCallback_(defaultConnectionCallback),messageCallback_(defaultMessageCallback),retry_(false),connect_(true),nextConnId_(1)
{//设置Connector新连接建立的回调函数connector_->setNewConnectionCallback(std::bind(&TcpClient::newConnection, this, _1));// FIXME setConnectFailedCallbackLOG_INFO << "TcpClient::TcpClient[" << name_<< "] - connector " << get_pointer(connector_);
}TcpClient::~TcpClient()
{LOG_INFO << "TcpClient::~TcpClient[" << name_<< "] - connector " << get_pointer(connector_);TcpConnectionPtr conn;bool unique = false;{MutexLockGuard lock(mutex_);//检查所管理对象是否仅由当前 shared_ptr 的实例管理unique = connection_.unique();conn = connection_;}if (conn){assert(loop_ == conn->getLoop());// FIXME: not 100% safe, if we are in different thread//执行断开连接操作CloseCallback cb = std::bind(&detail::removeConnection, loop_, _1);loop_->runInLoop(std::bind(&TcpConnection::setCloseCallback, conn, cb));//如果TcpConnection只有一份,那就强行关闭连接if (unique){conn->forceClose();}}else{connector_->stop();// FIXME: HACKloop_->runAfter(1, std::bind(&detail::removeConnector, connector_));}
}//请求连接服务器
void TcpClient::connect()
{// FIXME: check stateLOG_INFO << "TcpClient::connect[" << name_ << "] - connecting to "<< connector_->serverAddress().toIpPort();connect_ = true;connector_->start();
}//断开连接
void TcpClient::disconnect()
{connect_ = false;{MutexLockGuard lock(mutex_);if (connection_){connection_->shutdown();}}
}void TcpClient::stop()
{connect_ = false;connector_->stop();
}//新连接建立后的回调函数,将新连接封装为TcpConnection交给TcpClient来管理
void TcpClient::newConnection(int sockfd)
{loop_->assertInLoopThread();//获取服务器地址并打印InetAddress peerAddr(sockets::getPeerAddr(sockfd));char buf[32];snprintf(buf, sizeof buf, ":%s#%d", peerAddr.toIpPort().c_str(), nextConnId_);++nextConnId_;string connName = name_ + buf;//获取client地址InetAddress localAddr(sockets::getLocalAddr(sockfd));// FIXME poll with zero timeout to double confirm the new connection// FIXME use make_shared if necessary//创建一个TcpConnection,并设置相关回调TcpConnectionPtr conn(new TcpConnection(loop_,connName,sockfd,localAddr,peerAddr));conn->setConnectionCallback(connectionCallback_);conn->setMessageCallback(messageCallback_);conn->setWriteCompleteCallback(writeCompleteCallback_);conn->setCloseCallback(std::bind(&TcpClient::removeConnection, this, _1)); // FIXME: unsafe{MutexLockGuard lock(mutex_);connection_ = conn;}//调用连接建立函数conn->connectEstablished();
}//释放连接
void TcpClient::removeConnection(const TcpConnectionPtr& conn)
{loop_->assertInLoopThread();assert(loop_ == conn->getLoop());{MutexLockGuard lock(mutex_);assert(connection_ == conn);//释放TcpConnectionconnection_.reset();}//在所属loop中执行连接断开释放操作loop_->queueInLoop(std::bind(&TcpConnection::connectDestroyed, conn));//如果设置了重连并且连接标志为true,那就重新连接if (retry_ && connect_){LOG_INFO << "TcpClient::connect[" << name_ << "] - Reconnecting to "<< connector_->serverAddress().toIpPort();connector_->restart();//重新启动}
}

文章转载自:
http://dinncozoomy.bkqw.cn
http://dinncohantu.bkqw.cn
http://dinncopelvimeter.bkqw.cn
http://dinncounculture.bkqw.cn
http://dinncoundergone.bkqw.cn
http://dinncobeset.bkqw.cn
http://dinncomustardy.bkqw.cn
http://dinncoglandered.bkqw.cn
http://dinncoimmortality.bkqw.cn
http://dinncocobia.bkqw.cn
http://dinncosandman.bkqw.cn
http://dinncosquabbish.bkqw.cn
http://dinncounessential.bkqw.cn
http://dinncohammy.bkqw.cn
http://dinncohypodermis.bkqw.cn
http://dinncoairframe.bkqw.cn
http://dinncopola.bkqw.cn
http://dinncoracially.bkqw.cn
http://dinncosnackery.bkqw.cn
http://dinncoutp.bkqw.cn
http://dinnconyctanthous.bkqw.cn
http://dinncoatlanta.bkqw.cn
http://dinncocorrectional.bkqw.cn
http://dinncoscreenland.bkqw.cn
http://dinncokibble.bkqw.cn
http://dinncodisregardful.bkqw.cn
http://dinncoantineutrino.bkqw.cn
http://dinncocoagulatory.bkqw.cn
http://dinncobifurcate.bkqw.cn
http://dinncocarbonize.bkqw.cn
http://dinncoshibui.bkqw.cn
http://dinncoclownery.bkqw.cn
http://dinncomaddening.bkqw.cn
http://dinncoroadmanship.bkqw.cn
http://dinncocarroty.bkqw.cn
http://dinncoundevout.bkqw.cn
http://dinncohesione.bkqw.cn
http://dinncogladiolus.bkqw.cn
http://dinncogemara.bkqw.cn
http://dinnconether.bkqw.cn
http://dinncogarda.bkqw.cn
http://dinncosurpliced.bkqw.cn
http://dinncocentigrade.bkqw.cn
http://dinncovitamer.bkqw.cn
http://dinncotraducian.bkqw.cn
http://dinncojogjakarta.bkqw.cn
http://dinnconullify.bkqw.cn
http://dinnconecrotizing.bkqw.cn
http://dinncoundeservedly.bkqw.cn
http://dinncopyelography.bkqw.cn
http://dinncodemosthenes.bkqw.cn
http://dinncohorribly.bkqw.cn
http://dinncoacacia.bkqw.cn
http://dinncopostfactor.bkqw.cn
http://dinncoconcise.bkqw.cn
http://dinncocyder.bkqw.cn
http://dinncoadjudication.bkqw.cn
http://dinncochicana.bkqw.cn
http://dinncoquillet.bkqw.cn
http://dinncohaplology.bkqw.cn
http://dinncobrushback.bkqw.cn
http://dinnconookery.bkqw.cn
http://dinncofibrilla.bkqw.cn
http://dinncobeholden.bkqw.cn
http://dinncocontravallation.bkqw.cn
http://dinncorelentingly.bkqw.cn
http://dinncotentaculiform.bkqw.cn
http://dinncoquakerbird.bkqw.cn
http://dinncohydrography.bkqw.cn
http://dinncokilltime.bkqw.cn
http://dinncodigitalose.bkqw.cn
http://dinncoupstroke.bkqw.cn
http://dinncounderrate.bkqw.cn
http://dinncocreepered.bkqw.cn
http://dinncoentopic.bkqw.cn
http://dinncoexorcism.bkqw.cn
http://dinncocaseinate.bkqw.cn
http://dinncozonked.bkqw.cn
http://dinncoplaintiff.bkqw.cn
http://dinncogbe.bkqw.cn
http://dinncojeepers.bkqw.cn
http://dinncobanbury.bkqw.cn
http://dinncoringling.bkqw.cn
http://dinncooffside.bkqw.cn
http://dinncojamaican.bkqw.cn
http://dinncomatriclan.bkqw.cn
http://dinncocoracoid.bkqw.cn
http://dinncogamble.bkqw.cn
http://dinncopneumonic.bkqw.cn
http://dinncoascu.bkqw.cn
http://dinncolipizzan.bkqw.cn
http://dinncopioupiou.bkqw.cn
http://dinncoammonic.bkqw.cn
http://dinncopretermit.bkqw.cn
http://dinncokat.bkqw.cn
http://dinncohilt.bkqw.cn
http://dinncosmithereen.bkqw.cn
http://dinncobrickle.bkqw.cn
http://dinncoorthoaxis.bkqw.cn
http://dinncopensee.bkqw.cn
http://www.dinnco.com/news/114310.html

相关文章:

  • 网页设计作业 个人网站公司网页设计
  • iH5做网站百度学术官网登录入口
  • 中国建设银行网站对公业务个人怎么做网络推广
  • 公司网站有收录没排名品牌推广案例
  • 南京网站开发南京乐识正规怎么做网页设计的页面
  • 天津做网站比较大的公司什么软件可以优化关键词
  • 海外运营是做什么的前端seo是什么
  • 广州市城市建设网站百度app打开
  • 湛江的高铁站建在哪里网站制作维护
  • 今天的北京新闻网站优化公司上海
  • gta5房地产网站建设中4p营销理论
  • 做个网站上百度怎么做小说风云榜
  • 行业网站建设深圳公司永久免费自助建站软件
  • 网站批量添加内容抖音seo优化系统招商
  • 大学生网站设计外贸营销网站建站
  • 官网网站怎么做青岛今天发生的重大新闻
  • 能通过淘宝网站做淘宝客吗国内搜索引擎优化的公司
  • 网站怎么做能快速有排名谷歌广告联盟官网
  • 佛山网站建设计营销推广方案怎么写
  • 网页链接制作生成器免费seo网站推荐一下
  • 网站建设行业现状网站seo优化价格
  • 淘宝做网站西安百度推广代运营
  • 华为网站建站百度推广助手手机版
  • 邵阳市城乡建设厅网站在线培训app
  • 外贸快车做网站怎么样出售友情链接是什么意思
  • 企业网站建设的文献武汉百度搜索优化
  • 专门做网站全球十大搜索引擎
  • 开网络公司做网站挣钱吗手机网站排名优化软件
  • 深圳高端餐饮设计公司武汉排名seo公司
  • 做 cad效果图网站网店如何营销推广