@Fly3110
web developer

Почему запрос выполняется намного дольше при ресолве IPv6 адреса?

Всем привет.

Делаю запросы к своему домену из приложения на C++.
Запросы делаются с помощью функций из WinInet.h, то есть
InternetOpen -> InternetConnect -> HttpOpenRequest -> HttpSendRequest

Заметил, что у одних людей запросы выполняются моментально, у других очень долго (порядка 20-30 секунд на запрос). Выяснил, что дело в том, какой адрес ресолвится. Если это ipv6, то все медленно. Если я на машине, где ресолвится ipv6 адрес руками прописываю в hosts ipv4 адрес домена, то все начинает работает очень быстро.

Я честно гуглил, но не нашел ничего похожего.

Вот фрагмент кода:
hInet = InternetOpen(string("MyApp/" + AppVersionAsString).c_str(), INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if (!hInet) return false;

hConn = InternetConnect(hInet, appDomain.c_str(), 80, NULL, NULL, INTERNET_SERVICE_HTTP, 0, dwContext);
if (!hConn) return false;

DWORD dwFlags = INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_NO_COOKIES | INTERNET_FLAG_NO_UI | INTERNET_FLAG_PRAGMA_NOCACHE;
hReq = HttpOpenRequest(hConn, "POST", path.c_str(), "HTTP/1.1", NULL, rgpszAcceptTypes, dwFlags, dwContext);

DWORD connectTimeout = 5000;
InternetSetOption(hReq, INTERNET_OPTION_CONNECT_TIMEOUT, &connectTimeout, sizeof(connectTimeout));

bSuccess = HttpSendRequest(hReq, headers.c_str(), headers.length(), (LPVOID)PostData.c_str(), PostData.size());


добавлю: тормозит только первый запрос. Последующие выполняются быстро даже на ipv6
  • Вопрос задан
  • 97 просмотров
Пригласить эксперта
Ответы на вопрос 1
@anikavoi
Скорее всего дело в различии DNS серверов, участвующих в ресолве.
Попробуйте выставить 8.8.8.8 или 1.1.1.1 в качестве DNS-сервера на всех тестируемых, и сравните.
Если эффект останется, то ... не знаю.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы