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