1 #ifndef DOZERG_SOCKETS_H_20080229 2 #define DOZERG_SOCKETS_H_20080229 13 #include "sock_addr.hh" 21 enum EType{kTcp, kUdp};
29 struct sockaddr_storage sa;
30 socklen_t len =
sizeof sa;
31 ::memset(&sa, 0, len);
32 if(0 == ::getsockname(
fd(), reinterpret_cast<struct sockaddr *>(&sa), &len))
33 addr.setAddr(sa, len);
38 const CSockAddr & peerAddr()
const{
return peer_;}
51 bool linger(
bool on,
int timeoutS = 0){
53 ling.l_onoff = (on ? 1 : 0);
54 ling.l_linger = timeoutS;
55 return setOpt(SO_LINGER, ling);
58 bool reuseAddr(
bool on){
59 int flag = (on ? 1 : 0);
60 return setOpt(SO_REUSEADDR, flag);
64 bool recvTimeout(
int timeMs){
68 tv.tv_sec = timeMs / 1000;
69 tv.tv_usec = timeMs % 1000 * 1000;
70 return setOpt(SO_RCVTIMEO, tv);
76 int recvTimeout()
const{
78 if(!getOpt(SO_RCVTIMEO, &tv))
80 return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
84 bool sendTimeout(uint32_t timeMs){
88 tv.tv_sec = timeMs / 1000;
89 tv.tv_usec = timeMs % 1000 * 1000;
90 return setOpt(SO_SNDTIMEO, tv);
96 int sendTimeout()
const{
98 if(!getOpt(SO_SNDTIMEO, &tv))
100 return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
115 bool recvBufSize(
int size){
118 return setOpt(SO_RCVBUF, size);
123 int recvBufSize()
const{
125 if(!getOpt(SO_RCVBUF, &size))
142 bool sendBufSize(
int size){
145 return setOpt(SO_SNDBUF, size);
150 int sendBufSize()
const{
152 if(!getOpt(SO_SNDBUF, &size))
163 ssize_t recvData(
char * buf,
size_t sz,
bool waitAll =
false){
164 if(NULL == buf || !
valid())
166 return ::recv(
fd(), buf, sz, (waitAll ? MSG_WAITALL : 0));
170 ssize_t recvData(BufT & buf,
size_t sz,
bool waitAll =
false){
173 const size_t oldsz = buf.size();
174 buf.resize(oldsz + sz);
175 const ssize_t ret = recvData(&buf[oldsz], sz, waitAll);
178 else if(
size_t(ret) < sz)
179 buf.resize(oldsz + ret);
186 ssize_t sendData(
const char * buf,
size_t sz){
189 if(NULL == buf || 0 == sz)
191 return ::send(
fd(), buf, sz, MSG_NOSIGNAL);
194 ssize_t sendData(
const BufT & buf){
197 return sendData(&buf[0], buf.size());
203 <<
", host="<<hostAddr().toString()
204 <<
", peer="<<peerAddr().toString()
211 ISocket(
int family, EType type){
212 getSock(family, type);
214 bool getSock(
int family, EType type){
217 if(AF_INET6 == family)
221 fd_ = ::socket(family, SOCK_STREAM, IPPROTO_TCP);
224 fd_ = ::socket(family, SOCK_DGRAM, IPPROTO_UDP);
232 if(
valid() && addr.valid())
233 return (0 == ::bind(
fd(), addr.sockaddr(), addr.socklen()));
237 if(
valid() && addr.valid())
238 return (0 == ::connect(
fd(), addr.sockaddr(), addr.socklen())
239 || EINPROGRESS == errno);
244 bool setOpt(
int name,
const T & v){
246 && 0 == ::setsockopt(
fd(), SOL_SOCKET, name, &v,
sizeof v));
249 bool getOpt(
int name, T * v)
const{
251 socklen_t len =
sizeof(T);
253 && 0 == ::getsockopt(
fd(), SOL_SOCKET, name, v, &len));
260 static const int kFdType = 4;
267 bool getSock(
int family){
return ISocket::getSock(family, kUdp);}
275 if(!
valid() && !getSock(addr.family()))
280 bool connectAddr(
const CSockAddr & addr){
283 if(!
valid() && !getSock(addr.family()))
297 using ISocket::recvData;
298 ssize_t recvData(
CSockAddr & from,
char * buf,
size_t sz,
bool waitAll =
false){
299 if(NULL == buf || !
valid())
301 struct sockaddr_storage addr;
302 socklen_t len =
sizeof addr;
303 ::memset(&addr, 0, len);
304 ssize_t ret = ::recvfrom(
fd(), buf, sz, (waitAll ? MSG_WAITALL : 0), reinterpret_cast<sockaddr *>(&addr), &len);
306 from.setAddr(addr, len);
311 ssize_t recvData(
CSockAddr & from, BufT & buf,
size_t sz,
bool waitAll =
false){
314 struct sockaddr_storage addr;
315 socklen_t len =
sizeof addr;
316 ::memset(&addr, 0, len);
317 size_t oldsz = buf.size();
318 buf.resize(oldsz + sz);
319 ssize_t ret = recvData(from, &buf[oldsz], sz, waitAll);
321 from.setAddr(addr, len);
323 buf.resize(oldsz + ret);
333 using ISocket::sendData;
334 ssize_t sendData(
const CSockAddr & to,
const char * buf,
size_t sz){
335 if(!
valid() || NULL == buf)
340 return ISocket::sendData(buf, sz);
341 return ::sendto(
fd(), buf, sz, MSG_NOSIGNAL, to.sockaddr(),to.socklen());
344 ssize_t sendData(
const CSockAddr & to,
const BufT & buf){
347 return sendData(to, &buf[0], buf.size());
357 static const int kFdType = 2;
364 bool getSock(
int family){
return ISocket::getSock(family, kTcp);}
372 if(!
valid() && !getSock(addr.family()))
378 bool connectAddr(
const CSockAddr & addr){
381 if(!
valid() && !getSock(addr.family()))
396 return (getSock(peer.family())
404 static const int kQueueDefault = 1024;
405 static const int kFdType = 3;
412 bool getSock(
int family){
return ISocket::getSock(family, kTcp);}
420 if(!
valid() && !getSock(addr.family()))
431 bool listenAddr(
const CSockAddr & addr,
int queueSz = kQueueDefault){
434 if(!
valid() && !bindAddr(addr))
438 queueSz = kQueueDefault;
439 return (0 == ::listen(
fd(), queueSz));
444 if(!
valid() && (!getSock(addr.family()) || !bindTo(addr)))
447 if(!this->
block(block))
450 queueSz = kQueueDefault;
451 return (0 == ::listen(
fd(), queueSz));
458 struct sockaddr_storage ss;
459 socklen_t len =
sizeof ss;
460 sock.fd_ = ::accept(
fd(), reinterpret_cast<struct sockaddr *>(&ss), &len);
462 sock.peer_.setAddr(ss, len);
466 || EWOULDBLOCK == errno);
virtual std::string toString() const
Get readable description of this object.
Definition: file.hh:163
bool valid() const
Test if this object is a valid file descriptor.
Definition: file.hh:65
std::string toString() const
Get readable description of this object.
Definition: sockets.hh:200
Abstract interface of fd (file descriptor).
Definition: file.hh:43
Definition: to_string.hh:43
const char * fdTypeName() const
Get type name of this object.
Definition: sockets.hh:415
Definition: sockets.hh:401
Encapsulation for fd (file descriptor) and regular files.
Definition: sock_addr.hh:24
void close()
Close this fd.
Definition: file.hh:153
int fdType() const
Get type id of this object.
Definition: sockets.hh:366
int fd() const
Get fd (file descriptor).
Definition: file.hh:70
Definition: sockets.hh:257
bool block(bool on)
Set block/non-block for operations.
Definition: file.hh:137
int fdType() const
Get type id of this object.
Definition: sockets.hh:414
Definition: sockets.hh:17
int fdType() const
Get type id of this object.
Definition: sockets.hh:269
const char * fdTypeName() const
Get type name of this object.
Definition: sockets.hh:270
const char * fdTypeName() const
Get type name of this object.
Definition: sockets.hh:367
Definition: sockets.hh:353