sockbuf::sockdesc sockbuf::accept (sockAddr& sa) { socklen_t len = sa.size (); int soc = -1; if ((int)(soc = ::accept (rep->sock, sa.addr (), &len)) == -1) throw sockerr (errno, "sockbuf::sockdesc", sockname.text.c_str()); return sockdesc (soc); }
int sockbuf::recvfrom (sockAddr& sa, void* buf, int len, int msgf) { if (rep->rtmo != -1 && is_readready (rep->rtmo)==0) throw sockerr (ETIMEDOUT, "sockbuf::recvfrom", sockname.text.c_str()); if (rep->oob && atmark ()) throw sockoob (); int rval = 0; socklen_t __sa_len = sa.size (); if ((rval = ::recvfrom (rep->sock, (char*) buf, len, msgf, sa.addr (), &__sa_len)) == -1) throw sockerr (errno, "sockbuf::recvfrom", sockname.text.c_str()); return rval; }
int sockbuf::sendto (sockAddr& sa, const void* buf, int len, int msgf) // upon error, write throws the number of bytes writen so far instead // of sockerr. { if (rep->stmo != -1 && is_writeready (rep->stmo)==0) throw sockerr (ETIMEDOUT, "sockbuf::sendto", sockname.text.c_str()); int wlen=0; while(len>0) { int wval = ::sendto (rep->sock, (char*) buf, len, msgf, sa.addr (), sa.size()); if (wval == -1) throw wlen; len -= wval; wlen += wval; } return wlen; }
void sockbuf::connect (sockAddr& sa) { if (::connect(rep->sock, sa.addr (), sa.size()) == -1) throw sockerr (errno, "sockbuf::connect", sockname.text.c_str()); }
void sockbuf::bind (sockAddr& sa) { if (::bind (rep->sock, sa.addr (), sa.size ()) == -1) throw sockerr (errno, "sockbuf::bind", sockname.c_str()); }