34     virtual void * 
get() 
const = 0;
   112         protoIpip, protoIpv4 = protoIpip, 
   140 #if defined(_MSC_VER) || defined(WIN32)   149     static int const MsgOob;
   150     static int const MsgPeek;
   151     static int const MsgDontRoute;
   154     static int const MsgTryHard;
   156     static int const MsgCTrunc;
   157     static int const MsgProxy;
   158     static int const MsgTrunc;
   159     static int const MsgDontWait;
   160     static int const MsgEor;
   161     static int const MsgWaitAll;
   162     static int const MsgFin;
   163     static int const MsgSyn;
   164     static int const MsgConfirm;
   165     static int const MsgRst;
   166     static int const MsgErrQueue;
   167     static int const MsgNoSignal;
   168     static int const MsgMore;
   169     static int const MsgWaitForOne;
   170     static int const MsgCMsgCloexec;
   186     explicit Socket( 
int sock = -1, 
bool isNewSock = 
false );
   191 #ifndef MOVE_SEMANTICS_DISABLED   212     int shutdown( 
int how = SdReceive );
   215     int send( 
void const * data, 
int size, 
int msgFlags = MsgDefault );
   217     int send( 
winux::AnsiString const & data, 
int msgFlags = MsgDefault ) { 
return this->
send( data.c_str(), (int)data.size(), msgFlags ); }
   224     bool sendUntil( 
int targetSize, 
void const * data, 
int msgFlags = MsgDefault );
   235     int sendWaitUntil( 
int targetSize, 
void const * data, 
int * hadSent, 
double sec, 
int * rcWait, FunctionSuccessCallback eachSuccessCallback = FunctionSuccessCallback(), 
void * param = 
nullptr, 
int msgFlags = MsgDefault );
   236     int sendWaitUntil( 
winux::AnsiString const & data, 
int * hadSent, 
double sec, 
int * rcWait, FunctionSuccessCallback eachSuccessCallback = FunctionSuccessCallback(), 
void * param = 
nullptr, 
int msgFlags = MsgDefault )
   237     { 
return this->sendWaitUntil( (
int)data.size(), data.c_str(), hadSent, sec, rcWait, std::move(eachSuccessCallback), param, msgFlags ); }
   238     int sendWaitUntil( 
winux::Buffer const & data, 
int * hadSent, 
double sec, 
int * rcWait, FunctionSuccessCallback eachSuccessCallback = FunctionSuccessCallback(), 
void * param = 
nullptr, 
int msgFlags = MsgDefault )
   239     { 
return this->sendWaitUntil( (
int)data.
getSize(), data.
getBuf(), hadSent, sec, rcWait, std::move(eachSuccessCallback), param, msgFlags ); }
   242     template < 
typename _PodType >
   243     bool sendUntilType( _PodType 
const & v, 
int msgFlags = MsgDefault ) { 
return this->sendUntil( 
sizeof(_PodType), &v, msgFlags ); }
   246     int recv( 
void * buf, 
int size, 
int msgFlags = MsgDefault );
   269     int recvWaitUntilTarget( 
winux::AnsiString const & target, 
winux::GrowBuffer * data, 
winux::GrowBuffer * extraData, 
int * hadRead, 
int * startpos, 
int * pos, 
double sec, 
int * rcWait, FunctionSuccessCallback eachSuccessCallback = FunctionSuccessCallback(), 
void * param = 
nullptr, 
int msgFlags = MsgDefault );
   274     bool recvUntilSize( 
int targetSize, 
winux::GrowBuffer * data, 
int msgFlags = MsgDefault );
   283     int recvWaitUntilSize( 
int targetSize, 
winux::GrowBuffer * data, 
int * hadRead, 
double sec, 
int * rcWait, FunctionSuccessCallback eachSuccessCallback = FunctionSuccessCallback(), 
void * param = 
nullptr, 
int msgFlags = MsgDefault );
   286     template < 
typename _PodType >
   290         data.
setBuf( v, 0, 
sizeof(_PodType), 
true );
   291         return this->recvUntilSize( 
sizeof(_PodType), &data, msgFlags );
   310     winux::Buffer recvWaitAvail( 
double sec, 
int * rcWait, 
int msgFlags = MsgDefault );
   313     int sendTo( 
EndPoint const & ep, 
void const * data, 
int size, 
int msgFlags = MsgDefault );
   315     int recvFrom( 
EndPoint * ep, 
void * buf, 
int size, 
int msgFlags = MsgDefault );
   318     bool connect( 
EndPoint const & ep );
   324     bool listen( 
int backlog );
   329     bool accept( 
int * sock, 
EndPoint * ep = NULL );
   341     int getRecvBufSize() 
const;
   343     bool setRecvBufSize( 
int optval );
   346     int getSendBufSize() 
const;
   348     bool setSendBufSize( 
int optval );
   363     bool getReUseAddr() 
const;
   365     bool setReUseAddr( 
bool optval );
   368     bool getBroadcast() 
const;
   370     bool setBroadcast( 
bool optval );
   373     int getError() 
const;
   381     bool isListening() 
const;
   386     int getAvailable() 
const;
   389     bool setBlocking( 
bool blocking );
   397     operator bool()
 const { 
return this->
get() > -1; }
   412     enum { RetryCount = 10 };   
   430         this->extraData.
free();
   438         this->targetBytes = 0;
   439         this->retryCount = 0;
   450         std::ios_base::openmode mode = std::ios_base::in | std::ios_base::out,
   460     virtual int_type underflow();
   465     virtual int_type overflow( int_type c );
   502     std::streamsize getAvailable() 
const;
   506     std::streamsize waitAvail( 
double sec );
   529     virtual void * 
get() 
const;
   550     EndPointArray::iterator 
begin() { 
return _epArr.begin(); }
   551     EndPointArray::const_iterator 
begin()
 const { 
return _epArr.begin(); }
   552     EndPointArray::iterator 
end() { 
return _epArr.end(); }
   553     EndPointArray::const_iterator 
end()
 const { 
return _epArr.end(); }
   556     int count()
 const { 
return (
int)_epArr.size(); }
   562     EndPointArray::value_type 
const & operator [] ( 
int i )
 const { 
return _epArr[i]; }
   563     EndPointArray::value_type & operator [] ( 
int i ) { 
return _epArr[i]; }
   565     EndPointArray & 
getArr() { 
return _epArr; }
   566     EndPointArray 
const & 
getArr()
 const { 
return _epArr; }
   574     EndPointArray _epArr;
   589     explicit Socket( 
int sock, 
bool isNewSock = 
false ) : BaseClass( sock, isNewSock ) { }
   592     Socket() : BaseClass( BaseClass::afInet, BaseClass::sockStream, BaseClass::protoTcp ) { }
   594 #ifndef MOVE_SEMANTICS_DISABLED   600         BaseClass::operator = ( std::move(other) );
   607         return BaseClass::connect( 
EndPoint( ipAddr, port ) );
   612         return BaseClass::bind( 
EndPoint( ipAddr, port ) );
   648     explicit Socket( 
int sock, 
bool isNewSock = 
false ) : BaseClass( sock, isNewSock ) { }
   651     Socket() : BaseClass( BaseClass::afInet, BaseClass::sockDatagram, BaseClass::protoUdp ) { }
   653 #ifndef MOVE_SEMANTICS_DISABLED   659         BaseClass::operator = ( std::move(other) );
   666         return BaseClass::sendTo( 
EndPoint( ipAddr, port ), data, size, msgFlags );
   699     int hasReadFd( 
int fd ) 
const;
   705     int wait( 
double sec = -1 );
   729     int hasWriteFd( 
int fd ) 
const;
   735     int wait( 
double sec = -1 );
   759     int hasExceptFd( 
int fd ) 
const;
   765     int wait( 
double sec = -1 );
   797     Select & 
clear() { SelectRead::clear(); SelectWrite::clear(); SelectExcept::clear(); 
return *
this; }
   803     int wait( 
double sec = -1 );
   814         clientEpStr(clientEpStr),
   815         clientSockPtr(clientSockPtr)
   836 template < 
class _ClientCtxClass >
   850         _cumulativeClientId(0),
   852         _pool( threadCount, 
winux::ThreadPool::modeWaitTimeRePost, durationSec ),
   855         _stop = !( _servSock.eiennet::Socket::bind(ep) && _servSock.listen(backlog) );
   869             int rc = sel.
wait(0.5);
   875                     auto clientSockPtr = _servSock.accept(&clientEp);
   878                         auto & clientCtxPtr = this->_addClient( clientEp, clientSockPtr );
   881                         this->onStartup(clientCtxPtr);
   891         _pool.whenEmptyStopAndWait();
   898         return _clients.size();
   903         _startupHandler = handler;
   909         _clients.erase(clientId);
   918             ++_cumulativeClientId;
   919             client = &_clients[_cumulativeClientId];
   921         client->
attachNew( 
new _ClientCtxClass( _cumulativeClientId, clientEp.
toString(), clientSockPtr ) );
   930     std::map< winux::uint64, ClientCtxSharedPointer > 
_clients; 
   935         if ( this->_startupHandler ) this->_startupHandler(clientCtxPtr);
   947 #endif // __SOCKET_HPP__ 
#define EIENNET_FUNC_DECL(ret)
 
SelectWrite & setWriteSock(Socket const *sock)
 
int hasExceptSock(Socket const &sock) const 
 
winux::GrowBuffer extraData
 
SelectRead & setReadSock(Socket const &sock)
 
Socket(Socket &&other)
移动构造函数 
 
virtual winux::String toString() const 
把地址转换成一个字符串 
 
bool bind(winux::String const &ipAddr, winux::ushort port)
 
SocketStreamIn(SocketStreamBuf *sockBuf)
 
StartupHandlerFunction _startupHandler
 
void * getBuf() const 
暴露缓冲区指针 
 
bool sendUntilType(_PodType const &v, int msgFlags=MsgDefault)
发送一个Plain of Data类型的变量,若成功返回true,否则返回false。 
 
SocketStreamOut(winux::SimplePointer< SocketStreamBuf > &sockBuf)
 
Socket()
构造函数2,新建一个tcp socket. 
 
Select & setExceptFd(int fd)
 
int wait(double sec=-1)
等待相应的fd就绪。sec<1表示小于1秒的时间,sec<0表示无限等待。eg: sec=1.5表示等待1500ms ...
 
eiennet::Socket BaseClass
 
Select & clearExceptFds()
 
SelectExcept & setExceptSock(Socket const *sock)
 
winux::String const & getHostname() const 
获取主机名 
 
Select & setReadSock(Socket const &sock)
 
Select & setWriteFd(int fd)
 
std::basic_string< char > AnsiString
 
EndPointArray::const_iterator end() const 
 
static int const MsgDefault
 
int get() const 
Windows:socket句柄,或Linux:socket描述符 
 
EndPointArray::iterator begin()
 
int sendWaitUntil(winux::Buffer const &data, int *hadSent, double sec, int *rcWait, FunctionSuccessCallback eachSuccessCallback=FunctionSuccessCallback(), void *param=nullptr, int msgFlags=MsgDefault)
 
Socket * getSocket() const 
 
winux::ushort getPort() const 
获取端口号 
 
SocketStreamIn(SocketStreamBuf &sockBuf)
 
Socket(int sock, bool isNewSock=false)
构造函数1,包装现有socket描述符 
 
Socket()
构造函数2,新建一个udp socket. 
 
int sendTo(winux::String const &ipAddr, winux::ushort port, void const *data, int size, int msgFlags=MsgDefault)
 
SocketStreamIn(winux::SimplePointer< SocketStreamBuf > &sockBuf)
 
winux::MembersWrapper< struct Socket_Data > _self
 
SelectRead & setReadSock(Socket const *sock)
 
int hasReadSock(Socket const &sock) const 
 
winux::String clientEpStr
 
#define DISABLE_OBJECT_COPY(clsname)
 
std::map< winux::uint64, ClientCtxSharedPointer > _clients
 
Select & setWriteSock(Socket const &sock)
 
Select & delWriteFd(int fd)
 
static int const MsgDontRoute
 
Select & delExceptFd(int fd)
 
winux::SharedPointer< Socket > accept(EndPoint *ep=NULL)
接受一个客户连接 
 
void onStartupHandler(StartupHandlerFunction handler)
 
SocketStreamIn(winux::SharedPointer< SocketStreamBuf > &sockBuf)
 
void removeClient(winux::uint64 clientId)
 
Server(ip::EndPoint const &ep, int threadCount=4, int backlog=0, double durationSec=0.1)
构造函数1 
 
Select & setReadFds(winux::Mixed const &fds)
 
Select & setExceptSock(Socket const &sock)
 
int ConnectAttempt(Socket *sock, Resolver const &resolver, winux::uint32 perCnnTimeoutMs)
阻塞模式Socket连接尝试,连接成功返回0,超时返回1,失败返回-1 
 
eiennet::Socket BaseClass
 
int send(winux::Buffer const &data, int msgFlags=MsgDefault)
发送数据 
 
ip::tcp::Socket _servSock
 
winux::SharedPointer< Socket > accept(EndPoint *ep=NULL)
接受一个客户连接 
 
uint getSize() const 
获取数据大小 
 
Socket(Socket &&other)
移动构造函数 
 
Select & setReadFd(int fd)
 
缓冲区,表示内存中一块2进制数据(利用malloc/realloc进行内存分配) 
 
Socket(int sock, bool isNewSock=false)
构造函数1,包装现有socket描述符 
 
std::function< void(ClientCtxSharedPointer clientCtxPtr) > StartupHandlerFunction
 
winux::MembersWrapper< struct SelectRead_Data > _self
 
EndPointArray::iterator end()
 
ClientCtxSharedPointer & _addClient(ip::EndPoint const &clientEp, winux::SharedPointer< ip::tcp::Socket > clientSockPtr)
 
static int const MsgPartial
 
SelectExcept & setExceptSock(Socket const &sock)
 
int hasWriteSock(Socket const &sock) const 
 
Select & setWriteFds(winux::Mixed const &fds)
 
线程池,创建一组线程等待着从任务队列中获取任务执行 
 
SocketStreamOut(winux::SharedPointer< SocketStreamBuf > &sockBuf)
 
static int const MsgWaitAll
 
Select & delReadFd(int fd)
 
bool sendUntil(winux::Buffer const &data, int msgFlags=MsgDefault)
 
static int const MsgInterrupt
 
bool recvUntilType(_PodType *v, int msgFlags=MsgDefault)
接收一个Plain of Data类型的变量,若成功返回true,否则返回false。 
 
SocketError(int errType, winux::AnsiString const &errStr)
 
void setBuf(void *buf, uint size, uint capacity, bool isPeek)
设置缓冲区,当isPeek为false时拷贝数据缓冲区 
 
ClientCtx(winux::uint64 clientId, winux::String clientEpStr, winux::SharedPointer< ip::tcp::Socket > clientSockPtr)
 
主机名解析器(可以把域名解析为一个或多个IP端点) 
 
std::vector< ip::EndPoint > EndPointArray
 
winux::MembersWrapper< struct SelectExcept_Data > _self
 
int send(winux::AnsiString const &data, int msgFlags=MsgDefault)
发送数据 
 
winux::uint64 _cumulativeClientId
 
static int const MsgMaxIovLen
 
EndPointArray::const_iterator begin() const 
 
static int const SdReceive
 
unsigned long long uint64
 
size_t getClientsCount() const 
 
SelectWrite & setWriteSock(Socket const &sock)
 
bool connect(winux::String const &ipAddr, winux::ushort port)
 
bool sendUntil(winux::AnsiString const &data, int msgFlags=MsgDefault)
 
SocketStreamOut(SocketStreamBuf &sockBuf)
 
winux::SharedPointer< ip::tcp::Socket > clientSockPtr
 
std::function< void(int hadBytes, void *param) > FunctionSuccessCallback
 
int sendWaitUntil(winux::AnsiString const &data, int *hadSent, double sec, int *rcWait, FunctionSuccessCallback eachSuccessCallback=FunctionSuccessCallback(), void *param=nullptr, int msgFlags=MsgDefault)
 
SocketStreamOut(SocketStreamBuf *sockBuf)
 
int count() const 
获取解析到的IP端点数 
 
std::basic_string< tchar > String
 
virtual void onStartup(ClientCtxSharedPointer clientCtxPtr)
 
EndPointArray const & getArr() const 
 
Select & setExceptFds(winux::Mixed const &fds)
 
winux::MembersWrapper< struct SelectWrite_Data > _self