dnet_addr parse_addr(const std::string& addr) { dnet_addr ret; int port, family; memset(&ret, 0, sizeof(ret)); ret.addr_len = sizeof(ret.addr); std::string str_addr(addr); int err = dnet_parse_addr(const_cast<char *>(str_addr.c_str()), &port, &family); if (err) { std::cerr << "Wrong remote addr: " << addr << "\n" << std::endl; exit(1); } ret.family = family; dnet_fill_addr(&ret, const_cast<char *>(str_addr.c_str()), port, SOCK_STREAM, IPPROTO_TCP); return ret; }
dnet_addr parse_addr(const std::string& addr) { dnet_addr ret; int port, family; memset(&ret, 0, sizeof(ret)); ret.addr_len = sizeof(ret.addr); std::vector<char> tmp_addr(addr.begin(), addr.end()); tmp_addr.push_back('\0'); int err = dnet_parse_addr(tmp_addr.data(), &port, &family); if (err) { std::cerr << "Wrong remote addr: " << addr << "\n" << std::endl; exit(1); } ret.family = family; dnet_fill_addr(&ret, tmp_addr.data(), port, SOCK_STREAM, IPPROTO_TCP); return ret; }
static bool is_bindable(int port) { const int family = AF_INET; int s = ::socket(family, SOCK_STREAM, IPPROTO_TCP); if (s < 0) { int err = -errno; throw std::runtime_error("Failed to create socket for family: " + boost::lexical_cast<std::string>(family) + ", err: " + ::strerror(-err) + ", " + boost::lexical_cast<std::string>(err)); } dnet_addr addr; addr.addr_len = sizeof(addr.addr); addr.family = family; int err = dnet_fill_addr(&addr, "127.0.0.1", port, SOCK_STREAM, IPPROTO_TCP); if (err) { ::close(s); throw std::runtime_error(std::string("Failed to parse address: ") + strerror(-err) + ", " + boost::lexical_cast<std::string>(err)); } int salen = addr.addr_len; struct sockaddr *sa = reinterpret_cast<struct sockaddr *>(addr.addr); err = 0; ::setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &err, 4); err = ::bind(s, sa, salen); ::close(s); return (err == 0); }