59 memset(&hints, 0,
sizeof(
struct addrinfo));
60 hints.ai_family = AF_INET;
61 hints.ai_socktype = SOCK_STREAM;
62 hints.ai_flags = AI_NUMERICSERV;
63 hints.ai_protocol = 0;
66 struct addrinfo *addrinfo_result;
67 auto rv = ::getaddrinfo(host.
c_str(), port_str.c_str(), &hints, &addrinfo_result);
70 auto msg = fmt::format(
"::getaddrinfo failed: {}", gai_strerror(rv));
76 for (
auto *rp = addrinfo_result; rp !=
nullptr; rp = rp->ai_next)
78#if defined(SOCK_CLOEXEC)
79 const int flags = SOCK_CLOEXEC;
83 socket_ = ::socket(rp->ai_family, rp->ai_socktype | flags, rp->ai_protocol);
98 ::freeaddrinfo(addrinfo_result);
106 ::setsockopt(
socket_, IPPROTO_TCP, TCP_NODELAY,
reinterpret_cast<char *
>(&enable_flag),
sizeof(enable_flag));
109#if defined(SO_NOSIGPIPE) && !defined(MSG_NOSIGNAL)
110 ::setsockopt(
socket_, SOL_SOCKET, SO_NOSIGPIPE,
reinterpret_cast<char *
>(&enable_flag),
sizeof(enable_flag));
113#if !defined(SO_NOSIGPIPE) && !defined(MSG_NOSIGNAL)
114# error "tcp_sink would raise SIGPIPE since niether SO_NOSIGPIPE nor MSG_NOSIGNAL are available"