日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

muduo之Connector

發布時間:2025/6/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 muduo之Connector 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ? ??Connector負責主動發起連接,不負責創建socket,只負責連接的建立,外部調用Connector::start就可以發起連接,Connector具有重連的功能和停止連接的功能,連接成功建立后返回到TcpClient。

Connector.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 an internal header file, you should not include this.#ifndef MUDUO_NET_CONNECTOR_H #define MUDUO_NET_CONNECTOR_H#include "muduo/base/noncopyable.h" #include "muduo/net/InetAddress.h"#include <functional> #include <memory>namespace muduo { namespace net {class Channel; class EventLoop;//負責主動發起連接,不負責創建socket,只負責連接的建立 class Connector : noncopyable,public std::enable_shared_from_this<Connector> {public:typedef std::function<void (int sockfd)> NewConnectionCallback;Connector(EventLoop* loop, const InetAddress& serverAddr);~Connector();void setNewConnectionCallback(const NewConnectionCallback& cb){ newConnectionCallback_ = cb; }void start(); // can be called in any threadvoid restart(); // must be called in loop threadvoid stop(); // can be called in any threadconst InetAddress& serverAddress() const { return serverAddr_; }private:enum States { kDisconnected, kConnecting, kConnected };static const int kMaxRetryDelayMs = 30*1000;static const int kInitRetryDelayMs = 500;void setState(States s) { state_ = s; }void startInLoop();void stopInLoop();void connect();void connecting(int sockfd);void handleWrite();void handleError();void retry(int sockfd);int removeAndResetChannel();void resetChannel();EventLoop* loop_; //所屬的EventLoopInetAddress serverAddr_; //要連接的server地址bool connect_; // atomicStates state_; // FIXME: use atomic variablestd::unique_ptr<Channel> channel_; //對應的channelNewConnectionCallback newConnectionCallback_; //連接成功時的回調函數int retryDelayMs_; //重連間隔時間 };} // namespace net } // namespace muduo#endif // MUDUO_NET_CONNECTOR_H

Connector.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/Connector.h"#include "muduo/base/Logging.h" #include "muduo/net/Channel.h" #include "muduo/net/EventLoop.h" #include "muduo/net/SocketsOps.h"#include <errno.h>using namespace muduo; using namespace muduo::net;const int Connector::kMaxRetryDelayMs;Connector::Connector(EventLoop* loop, const InetAddress& serverAddr): loop_(loop),serverAddr_(serverAddr),connect_(false),state_(kDisconnected),retryDelayMs_(kInitRetryDelayMs) {LOG_DEBUG << "ctor[" << this << "]"; }Connector::~Connector() {LOG_DEBUG << "dtor[" << this << "]";assert(!channel_); }void Connector::start() {connect_ = true;//在所屬IO線程Lloop中調用該函數loop_->runInLoop(std::bind(&Connector::startInLoop, this)); // FIXME: unsafe }void Connector::startInLoop() {loop_->assertInLoopThread();assert(state_ == kDisconnected);if (connect_){connect(); //請求連接}else{LOG_DEBUG << "do not connect";} }void Connector::stop() {connect_ = false;loop_->queueInLoop(std::bind(&Connector::stopInLoop, this)); // FIXME: unsafe// FIXME: cancel timer }void Connector::stopInLoop() {loop_->assertInLoopThread();if (state_ == kConnecting){setState(kDisconnected);int sockfd = removeAndResetChannel();retry(sockfd);} }void Connector::connect() {int sockfd = sockets::createNonblockingOrDie(serverAddr_.family());//創建非阻塞socketint ret = sockets::connect(sockfd, serverAddr_.getSockAddr());// 請求連接int savedErrno = (ret == 0) ? 0 : errno;switch (savedErrno){case 0:case EINPROGRESS: //socket是非阻塞,返回這個錯誤碼表示正在連接case EINTR:case EISCONN: //連接成功connecting(sockfd);break;case EAGAIN: //connect返回EAGAIN是真的錯誤了case EADDRINUSE:case EADDRNOTAVAIL:case ECONNREFUSED:case ENETUNREACH:retry(sockfd); //重連break;case EACCES:case EPERM:case EAFNOSUPPORT:case EALREADY:case EBADF:case EFAULT:case ENOTSOCK:LOG_SYSERR << "connect error in Connector::startInLoop " << savedErrno;sockets::close(sockfd); //關閉socketbreak;default:LOG_SYSERR << "Unexpected error in Connector::startInLoop " << savedErrno;sockets::close(sockfd);// connectErrorCallback_();break;} }void Connector::restart() {loop_->assertInLoopThread();setState(kDisconnected);retryDelayMs_ = kInitRetryDelayMs;connect_ = true;startInLoop(); }void Connector::connecting(int sockfd) {setState(kConnecting); //設置狀態為正在進行連接assert(!channel_);//channel對應于一個文件描述符,所以在有了socket后才能創建channelchannel_.reset(new Channel(loop_, sockfd));//設置回調函數channel_->setWriteCallback(std::bind(&Connector::handleWrite, this)); // FIXME: unsafechannel_->setErrorCallback(std::bind(&Connector::handleError, this)); // FIXME: unsafe// channel_->tie(shared_from_this()); is not working,// as channel_ is not managed by shared_ptrchannel_->enableWriting(); //注冊可寫事件 }int Connector::removeAndResetChannel() {channel_->disableAll();channel_->remove();int sockfd = channel_->fd();// Can't reset channel_ here, because we are inside Channel::handleEventloop_->queueInLoop(std::bind(&Connector::resetChannel, this)); // FIXME: unsafereturn sockfd; }void Connector::resetChannel() {channel_.reset(); }void Connector::handleWrite() //可寫事件的回調函數 {LOG_TRACE << "Connector::handleWrite " << state_;if (state_ == kConnecting){//移除channel(Connector的channel只管理建立連接的階段),成功建立連接后//交給TcpClient的TcpConnection來管理int sockfd = removeAndResetChannel();//可寫并不一定連接建立成功//如果連接發生錯誤,socket會是可讀可寫的//所以還需要調用getsockopt檢查是否出錯int err = sockets::getSocketError(sockfd);if (err){LOG_WARN << "Connector::handleWrite - SO_ERROR = "<< err << " " << strerror_tl(err);retry(sockfd); //出錯重連}else if (sockets::isSelfConnect(sockfd)) //是否是自連接{LOG_WARN << "Connector::handleWrite - Self connect";retry(sockfd); }else{//連接成功建立,更改狀態//調用TcpClient設置的回調函數,創建TcpConnection對象 setState(kConnected);if (connect_){newConnectionCallback_(sockfd);}else{sockets::close(sockfd);}}}else{// what happened?assert(state_ == kDisconnected);} }void Connector::handleError() {LOG_ERROR << "Connector::handleError state=" << state_;if (state_ == kConnecting){int sockfd = removeAndResetChannel();int err = sockets::getSocketError(sockfd);LOG_TRACE << "SO_ERROR = " << err << " " << strerror_tl(err);retry(sockfd);} }void Connector::retry(int sockfd) {//socket是一次性的,失敗后需要關閉重新創建sockets::close(sockfd);setState(kDisconnected);if (connect_){LOG_INFO << "Connector::retry - Retry connecting to " << serverAddr_.toIpPort()<< " in " << retryDelayMs_ << " milliseconds. ";//隔一段時間后重連,重新執行startInLooploop_->runAfter(retryDelayMs_/1000.0,std::bind(&Connector::startInLoop, shared_from_this()));//間隔時間翻倍retryDelayMs_ = std::min(retryDelayMs_ * 2, kMaxRetryDelayMs);}else{LOG_DEBUG << "do not connect";} }

?

總結

以上是生活随笔為你收集整理的muduo之Connector的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: а√天堂8资源在线官网 | 不卡中文av | 国产波霸爆乳一区二区 | 国产美女自拍 | 日韩bbw| av网站在线观看免费 | 国产黄色视屏 | 国产成人一区二区三区小说 | 求欧美精品网址 | 婷婷色站 | 免费福利av | 黄色免费网站在线 | 大桥未久中文字幕 | 午夜视频在线免费 | 国产精品欧美激情在线播放 | 亚洲日本欧美精品 | 国产婷婷一区二区三区久久 | 成人福利视频在线 | 夜色视频在线观看 | 黄色三级三级三级三级 | www.日本在线 | 国产100页| 青青草婷婷 | 宅男午夜影院 | 狠狠干夜夜草 | 欧美色鬼 | 欧美一区二区三区网站 | 日韩一区在线观看视频 | 少妇激情网 | 精品久久影院 | 成人福利在线免费观看 | 国产xxxxxx | 婷婷精品视频 | 日韩一区二区视频在线 | 97成人资源 | 国产精品suv一区 | 国产人妻777人伦精品hd | 欧美成人精品一区二区男人看 | 日本一区二区三区视频免费看 | 高潮av在线| 亚洲美女视频 | 两个人做羞羞的视频 | 亚欧洲乱码视频 | 精品免费国产一区二区三区四区 | 人人射av | 六月婷婷av | 疯狂做受xxxx国产 | 国内成人精品 | 中文字幕成人动漫 | 操欧洲美女 | 欧美日韩不卡在线 | 国产99视频在线观看 | 免费看日韩毛片 | 91看片在线 | 爽妇网av| 国产精品白嫩极品美女视频 | 老女人毛片50一60岁 | 国内精品在线播放 | 在线观看91 | 日韩aa| 国产精品一品二区三区的使用体验 | 女优色图 | 久久男人精品 | 免费看av在线 | 九九九九精品九九九九 | 啊v视频在线 | 久久久久亚洲av无码专区首jn | 绿色地狱在线观看 | 色婷婷电影网 | 国产乱叫456在线 | 91av免费观看 | 亚洲视频黄色 | 日韩免费视频一区二区 | 777777av| 欧美一级免费观看 | 欧美精品一级在线观看 | 免费无遮挡无码永久视频 | 在线观看的网站 | 国产三级视频在线 | 密臀av | 国产成人av一区 | 蜜色av| jizzjizz国产| 美妇湿透娇羞紧窄迎合 | 天天噜 | 亚洲69 | 日本成人免费网站 | 日本大胆欧美人术艺术 | 欧美性生活在线视频 | 九九影视理伦片 | 精品一区二区三区不卡 | 99在线视频精品 | 青青伊人久久 | 扒开伸进免费视频 | 美女校花脱精光 | 妹子干综合网 | 91尤物国产福利在线观看 | 国产一区二区视频免费在线观看 | xxxx国产|