sockbuf::sockdesc sockbuf::accept () { int soc = -1; if ((int)(soc = ::accept (rep->sock, 0, 0)) == -1) throw sockerr (errno, "sockbuf::sockdesc", sockname.text.c_str()); return sockdesc (soc); }
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); }
void RawSocket::AsyncConnect() { int flags; int sock = socket((address.ss_family == AF_INET6) ? AF_INET6 : AF_INET, SOCK_STREAM, 0); if (sock < 0) throw IOException::MakeException("Failed to initialize socket", errno); Descriptor sockdesc(sock); if(flags = fcntl(sock, F_GETFL, NULL) < 0) throw IOException::MakeException("Failed to get socket flags", errno); if(fcntl(sock, F_SETFL, flags | O_NONBLOCK) < 0) throw IOException::MakeException("Failed to set socket nonblocking", errno); int connectstate = connect(sock, (sockaddr *) &address, (address.ss_family == AF_INET) ? sizeof(sockaddr_in) : sizeof(sockaddr_in6)); if (connectstate < 0 && errno != EINPROGRESS) throw IOException::MakeException("Failed to connect socket", errno); SetReadDescriptor(sockdesc); SetWriteDescriptor(sockdesc); }