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 #include "SocketHandlerEp.h"
00033 #include "Exception.h"
00034 #include "IMutex.h"
00035 #include "Utility.h"
00036
00037 #include <errno.h>
00038
00039
00040 #ifdef SOCKETS_NAMESPACE
00041 namespace SOCKETS_NAMESPACE {
00042 #endif
00043
00044
00045 SocketHandlerEp::SocketHandlerEp(StdLog *p)
00046 :SocketHandler(p)
00047 ,m_epoll(-1)
00048 {
00049 #ifdef LINUX
00050 m_epoll = epoll_create(FD_SETSIZE);
00051 if (m_epoll == -1)
00052 {
00053 throw Exception(StrError(Errno));
00054 }
00055 #endif
00056 }
00057
00058
00059 SocketHandlerEp::SocketHandlerEp(IMutex& mutex, StdLog *p)
00060 :SocketHandler(mutex, p)
00061 ,m_epoll(-1)
00062 {
00063 #ifdef LINUX
00064 m_epoll = epoll_create(FD_SETSIZE);
00065 if (m_epoll == -1)
00066 {
00067 throw Exception(StrError(Errno));
00068 }
00069 #endif
00070 }
00071
00072
00073 SocketHandlerEp::SocketHandlerEp(IMutex& mutex, ISocketHandler& parent, StdLog *p)
00074 :SocketHandler(mutex, parent, p)
00075 ,m_epoll(-1)
00076 {
00077 #ifdef LINUX
00078 m_epoll = epoll_create(FD_SETSIZE);
00079 if (m_epoll == -1)
00080 {
00081 throw Exception(StrError(Errno));
00082 }
00083 #endif
00084 }
00085
00086
00087 SocketHandlerEp::~SocketHandlerEp()
00088 {
00089 #ifdef LINUX
00090 if (m_epoll != -1)
00091 {
00092 close(m_epoll);
00093 }
00094 #endif
00095 }
00096
00097
00098 ISocketHandler *SocketHandlerEp::Create(StdLog *log)
00099 {
00100 return new SocketHandlerEp(log);
00101 }
00102
00103
00104 ISocketHandler *SocketHandlerEp::Create(IMutex& mutex, ISocketHandler& parent, StdLog *log)
00105 {
00106 return new SocketHandlerEp(mutex, parent, log);
00107 }
00108
00109
00110 #ifdef LINUX
00111 void SocketHandlerEp::ISocketHandler_Add(Socket *p,bool bRead,bool bWrite)
00112 {
00113 struct epoll_event stat;
00114 SOCKET s = p -> GetSocket();
00115 stat.data.ptr = p;
00116 stat.events = (bRead ? EPOLLIN : 0) | (bWrite ? EPOLLOUT : 0);
00117 if (epoll_ctl(m_epoll, EPOLL_CTL_ADD, s, &stat) == -1)
00118 {
00119 LogError(NULL, "epoll_ctl: EPOLL_CTL_ADD", Errno, StrError(Errno));
00120 }
00121 }
00122
00123
00124 void SocketHandlerEp::ISocketHandler_Mod(Socket *p,bool r,bool w)
00125 {
00126 struct epoll_event stat;
00127 SOCKET s = p -> GetSocket();
00128 stat.data.ptr = p;
00129 stat.events = (r ? EPOLLIN : 0) | (w ? EPOLLOUT : 0);
00130 if (epoll_ctl(m_epoll, EPOLL_CTL_MOD, s, &stat) == -1)
00131 {
00132
00133 }
00134 }
00135
00136
00137 void SocketHandlerEp::ISocketHandler_Del(Socket *p)
00138 {
00139 struct epoll_event stat;
00140 stat.events = 0;
00141 stat.data.ptr = p;
00142 if (epoll_ctl(m_epoll, EPOLL_CTL_DEL, p -> GetSocket(), &stat) == -1)
00143 {
00144
00145 }
00146 }
00147
00148
00149 int SocketHandlerEp::ISocketHandler_Select(struct timeval *tsel)
00150 {
00151 int n;
00152 if (m_b_use_mutex)
00153 {
00154 m_mutex.Unlock();
00155 n = epoll_wait(m_epoll, m_events, MAX_EVENTS_EP_WAIT, tsel ? tsel -> tv_sec * 1000 + tsel -> tv_usec / 1000 : -1);
00156 m_mutex.Lock();
00157 }
00158 else
00159 {
00160 n = epoll_wait(m_epoll, m_events, MAX_EVENTS_EP_WAIT, tsel ? tsel -> tv_sec * 1000 + tsel -> tv_usec / 1000 : -1);
00161 }
00162 if (n == -1)
00163 {
00164 LogError(NULL, "epoll_wait", Errno, StrError(Errno));
00165 }
00166 else
00167 if (!n)
00168 {
00169 }
00170 else
00171 if (n > 0)
00172 {
00173 for (int x = 0; x < n; x++)
00174 {
00175 Socket *p = static_cast<Socket *>(m_events[x].data.ptr);
00176 if ((m_events[x].events & EPOLLIN) || (m_events[x].events & EPOLLHUP))
00177 {
00178 #ifdef HAVE_OPENSSL
00179 if (p -> IsSSLNegotiate())
00180 {
00181 p -> SSLNegotiate();
00182 }
00183 else
00184 #endif
00185 {
00186 p -> OnRead();
00187 }
00188 }
00189 if (m_events[x].events & EPOLLOUT)
00190 {
00191 #ifdef HAVE_OPENSSL
00192 if (p -> IsSSLNegotiate())
00193 {
00194 p -> SSLNegotiate();
00195 }
00196 else
00197 #endif
00198 {
00199 p -> OnWrite();
00200 }
00201 }
00202 if (m_events[x].events & EPOLLERR)
00203 {
00204 p -> OnException();
00205 }
00206 }
00207 }
00208 return n;
00209 }
00210 #endif
00211
00212
00213 #ifdef SOCKETS_NAMESPACE
00214 }
00215 #endif
00216