00001
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef _SOCKETS_SocketHandler_H
00033 #define _SOCKETS_SocketHandler_H
00034
00035 #include "sockets-config.h"
00036 #include <map>
00037 #include <list>
00038
00039 #include "socket_include.h"
00040 #include "ISocketHandler.h"
00041
00042 #ifdef SOCKETS_NAMESPACE
00043 namespace SOCKETS_NAMESPACE {
00044 #endif
00045
00046
00047 class Socket;
00048 #ifdef ENABLE_RESOLVER
00049 class ResolvServer;
00050 #endif
00051 class IMutex;
00052 class SocketHandlerThread;
00053 class UdpSocket;
00054
00057 class SocketHandler : public ISocketHandler
00058 {
00059 protected:
00061 typedef std::map<SOCKET,Socket *> socket_m;
00062
00063 public:
00066 SocketHandler(StdLog *log = NULL);
00067
00071 SocketHandler(IMutex& mutex,StdLog *log = NULL);
00072
00073 SocketHandler(IMutex&, ISocketHandler& parent, StdLog * = NULL);
00074
00075 ~SocketHandler();
00076
00077 virtual ISocketHandler *Create(StdLog * = NULL);
00078 virtual ISocketHandler *Create(IMutex&, ISocketHandler&, StdLog * = NULL);
00079
00080 virtual bool ParentHandlerIsValid();
00081
00082 virtual ISocketHandler& ParentHandler();
00083
00084 virtual ISocketHandler& GetRandomHandler();
00085
00086 virtual ISocketHandler& GetEffectiveHandler();
00087
00088 virtual void SetNumberOfThreads(size_t n);
00089 virtual bool IsThreaded();
00090
00091 virtual void EnableRelease();
00092 virtual void Release();
00093
00095 IMutex& GetMutex() const;
00096
00099 void RegStdLog(StdLog *log);
00100
00102 void LogError(Socket *p,const std::string& user_text,int err,const std::string& sys_err,loglevel_t t = LOG_LEVEL_WARNING);
00103
00105 void Add(Socket *);
00106
00108 void ISocketHandler_Add(Socket *,bool bRead,bool bWrite);
00109 void ISocketHandler_Mod(Socket *,bool bRead,bool bWrite);
00110 void ISocketHandler_Del(Socket *);
00111
00113 int Select(long sec,long usec);
00114
00116 int Select();
00117
00119 int Select(struct timeval *tsel);
00120
00122 bool Valid(Socket *);
00123 bool Valid(socketuid_t);
00124
00126 size_t GetCount();
00127 size_t MaxCount() { return FD_SETSIZE; }
00128
00131 bool OkToAccept(Socket *p);
00132
00134 const std::map<SOCKET, Socket *>& AllSockets() { return m_sockets; }
00135
00136 size_t MaxTcpLineSize() { return TCP_LINE_SIZE; }
00137
00138 void SetCallOnConnect(bool = true);
00139 void SetDetach(bool = true);
00140 void SetTimeout(bool = true);
00141 void SetRetry(bool = true);
00142 void SetClose(bool = true);
00143
00144 private:
00145 static FILE *m_event_file;
00146 static unsigned long m_event_counter;
00147
00148 public:
00149
00150 #ifdef ENABLE_POOL
00151
00152 ISocketHandler::PoolSocket *FindConnection(int type,const std::string& protocol,SocketAddress&);
00154 void EnablePool(bool x = true);
00157 bool PoolEnabled();
00158 #endif // ENABLE_POOL
00159
00160
00161 #ifdef ENABLE_SOCKS4
00162
00163 void SetSocks4Host(ipaddr_t);
00165 void SetSocks4Host(const std::string& );
00167 void SetSocks4Port(port_t);
00169 void SetSocks4Userid(const std::string& );
00171 void SetSocks4TryDirect(bool x = true);
00174 ipaddr_t GetSocks4Host();
00177 port_t GetSocks4Port();
00180 const std::string& GetSocks4Userid();
00183 bool Socks4TryDirect();
00184 #endif // ENABLE_SOCKS4
00185
00186
00187 #ifdef ENABLE_RESOLVER
00188
00190 void EnableResolver(port_t port = 16667);
00193 bool ResolverEnabled();
00197 int Resolve(Socket *,const std::string& host,port_t port);
00198 #ifdef ENABLE_IPV6
00199 int Resolve6(Socket *,const std::string& host,port_t port);
00200 #endif
00201
00202 int Resolve(Socket *,ipaddr_t a);
00203 #ifdef ENABLE_IPV6
00204 int Resolve(Socket *,in6_addr& a);
00205 #endif
00206
00207 port_t GetResolverPort();
00209 bool ResolverReady();
00211 bool Resolving(Socket *);
00212 #endif // ENABLE_RESOLVER
00213
00214 #ifdef ENABLE_DETACH
00215
00216 void SetSlave(bool x = true);
00218 bool IsSlave();
00219 #endif
00220
00221 protected:
00222 socket_m m_sockets;
00223 std::list<Socket *> m_add;
00224 std::list<Socket *> m_delete;
00225
00226 protected:
00228 int ISocketHandler_Select(struct timeval *);
00230 void Remove(Socket *);
00232 void DeleteSocket(Socket *);
00233 void AddIncoming();
00234 void CheckErasedSockets();
00235 void CheckCallOnConnect();
00236 void CheckDetach();
00237 void CheckTimeout(time_t);
00238 void CheckRetry();
00239 void CheckClose();
00240
00241 StdLog *m_stdlog;
00242 IMutex& m_mutex;
00243 bool m_b_use_mutex;
00244 ISocketHandler& m_parent;
00245 bool m_b_parent_is_valid;
00246
00247 private:
00248 void RebuildFdset();
00249 void Set(Socket *,bool,bool);
00250
00251 std::list<SocketHandlerThread *> m_threads;
00252 UdpSocket *m_release;
00253
00254 SOCKET m_maxsock;
00255 fd_set m_rfds;
00256 fd_set m_wfds;
00257 fd_set m_efds;
00258 time_t m_tlast;
00259
00260
00261 std::list<socketuid_t> m_fds_erase;
00262
00263 bool m_b_check_callonconnect;
00264 bool m_b_check_detach;
00265 bool m_b_check_timeout;
00266 bool m_b_check_retry;
00267 bool m_b_check_close;
00268
00269 #ifdef ENABLE_SOCKS4
00270 ipaddr_t m_socks4_host;
00271 port_t m_socks4_port;
00272 std::string m_socks4_userid;
00273 bool m_bTryDirect;
00274 #endif
00275 #ifdef ENABLE_RESOLVER
00276 int m_resolv_id;
00277 ResolvServer *m_resolver;
00278 port_t m_resolver_port;
00279 std::map<socketuid_t, bool> m_resolve_q;
00280 #endif
00281 #ifdef ENABLE_POOL
00282 bool m_b_enable_pool;
00283 #endif
00284 #ifdef ENABLE_DETACH
00285 bool m_slave;
00286 #endif
00287 };
00288
00289
00290 #ifdef SOCKETS_NAMESPACE
00291 }
00292 #endif
00293
00294 #endif // _SOCKETS_SocketHandler_H
00295