// excerpts from 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) #ifndef MUDUO_NET_CONNECTOR_H #define MUDUO_NET_CONNECTOR_H #include "InetAddress.h" #include "TimerId.h" #include #include #include #include namespace muduo { class Channel; class EventLoop; class Connector : boost::noncopyable { public: typedef boost::function NewConnectionCallback; Connector(EventLoop* loop, const InetAddress& serverAddr); ~Connector(); void setNewConnectionCallback(const NewConnectionCallback& cb) { newConnectionCallback_ = cb; } void start(); // can be called in any thread void restart(); // must be called in loop thread void stop(); // can be called in any thread const 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 connect(); void connecting(int sockfd); void handleWrite(); void handleError(); void retry(int sockfd); int removeAndResetChannel(); void resetChannel(); EventLoop* loop_; InetAddress serverAddr_; bool connect_; // atomic States state_; // FIXME: use atomic variable boost::scoped_ptr channel_; NewConnectionCallback newConnectionCallback_; int retryDelayMs_; TimerId timerId_; }; typedef boost::shared_ptr ConnectorPtr; } #endif // MUDUO_NET_CONNECTOR_H