61 template<
typename TSocket>
63 auto socket = std::make_shared<TSocket>(std::move(sock));
65 co_await socket->Connect(addr, deadline);
68 co_return co_await socket->ReadSome(buf, size);
71 co_return co_await socket->WriteSome(buf, size);
76 co_await Connector(addr, deadline);
80 co_return co_await Reader(buf, size);
84 co_return co_await Writer(buf, size);
88 std::function<TFuture<void>(
const TAddress& addr, TTime deadline)> Connector;
89 std::function<TFuture<ssize_t>(
void* buf,
size_t size)> Reader;
90 std::function<TFuture<ssize_t>(
const void* buf,
size_t size)> Writer;
129 template<
typename TPoller>
130 TResolver(TPoller& poller, EDNSType defaultType = EDNSType::A);
141 template<
typename TPoller>
152 template<
typename TPoller>
153 TResolver(
TAddress dnsAddr, TPoller& poller, EDNSType defaultType = EDNSType::A);
181 std::coroutine_handle<> SenderSuspended;
185 EDNSType DefaultType;
187 struct TResolveRequest {
191 bool operator==(
const TResolveRequest& other)
const {
192 return Name == other.Name && Type == other.Type;
195 size_t hash()
const {
196 std::size_t result = 0;
197 result ^= std::hash<std::string>()(Name) + 0x9e3779b9 + (result << 6) + (result >> 2);
198 result ^= std::hash<EDNSType>()(Type) + 0x9e3779b9 + (result << 6) + (result >> 2);
203 struct TResolveRequestHash
205 std::size_t operator()(
const TResolveRequest& c)
const
211 std::queue<TResolveRequest> AddResolveQueue;
212 std::queue<std::pair<TTime, TResolveRequest>> TimeoutsQueue;
214 struct TResolveResult {
215 std::vector<TAddress> Addresses = {};
216 std::exception_ptr Exception =
nullptr;
220 void ResumeWaiters(TResolveResult&& result,
const TResolveRequest& req);
222 std::unordered_map<TResolveRequest, TResolveResult, TResolveRequestHash> Results;
223 std::unordered_map<TResolveRequest, std::vector<std::coroutine_handle<>>, TResolveRequestHash> WaitingAddrs;
224 std::unordered_map<uint64_t, TResolveRequest> Inflight;
241 : DnsAddr(std::move(dnsAddr))
242 , Socket(typename TPoller::
TSocket(poller, DnsAddr.Domain(), SOCK_DGRAM))
243 , DefaultType(defaultType)
246 Sender = SenderTask();
247 Receiver = ReceiverTask();
248 Timeouts = TimeoutsTask([&poller](TTime until) ->
TFuture<void> {
249 co_await poller.Sleep(until);
TFuture< std::vector< TAddress > > Resolve(const std::string &hostname, EDNSType type=EDNSType::DEFAULT)
Resolves a hostname to a list of addresses.
Definition resolver.cpp:266
TResolver(TPoller &poller, EDNSType defaultType=EDNSType::A)
Constructs a TResolver using the default resolv configuration.
Definition resolver.hpp:230