예제 #1
0
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;
}
예제 #2
0
파일: iterate.cpp 프로젝트: 3Hren/elliptics
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;
}
예제 #3
0
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);
}