Длинный опрос с WinAPI InternetReadFile () - PullRequest
0 голосов
/ 23 мая 2019

Я пишу кроссплатформенное приложение. Мне нужно получить данные из URL-адреса longpoll.

В Mac / Linux я могу использовать curl, curl_easy_perform() обо всем позаботится автоматически.

В Windows я должен использовать нативный API. Приведенный ниже код прекрасно работает для обычных URL-адресов, но когда я пытаюсь использовать URL-адрес longpoll, он просто завершает работу немедленно (nr_read == 0) вместо ожидания появления новых данных:

...
   flags =
 INTERNET_FLAG_HYPERLINK | INTERNET_FLAG_IGNORE_CERT_CN_INVALID |
 INTERNET_FLAG_IGNORE_CERT_DATE_INVALID |
 INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |
 INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS | INTERNET_FLAG_NO_AUTH |
 INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_NO_UI |
 INTERNET_FLAG_NO_COOKIES  |  
 INTERNET_FLAG_KEEP_CONNECTION |
 INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD 
 INTERNET_FLAG_SECURE;
...

HINTERNET internet = InternetOpenA(user_agent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
HINTERNET connect = InternetConnectA(internet, host, port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
HINTERNET request = HttpOpenRequest(connect, req_typ, path, "HTTP/1.1", NULL, NULL, flags, NULL);


#define BUF_MAX 1024
TCHAR buf[BUF_MAX + 1];
int nr_read = 0;
while (1) {
     int ok = InternetReadFile(request, buf, BUF_MAX, &nr_read);
     if (!ok) {
             puts("not ok");
             break;
     }
     if (nr_read == 0) {
             puts("nr read 0, breaking");
             break;
     }
     buf[nr_read] = 0;
     printf("buf='%s'\n", buf);
     nr_read = 0;
}

Заголовки ответа, которые я получаю:

HTTP/1.1 101
Switching Protocols
upgrade: websocket
connection: upgrade

После рукопожатия libcurl продолжает передавать данные websocket (которые я могу обработать вручную), но InternetReadFile() просто завершается.

Я отправляю http запрос с

Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Key: key
Sec-WebSocket-Version: 13

сервер отвечает с заголовками выше, а затем libcurl дает мне {"type": "hello"} и так далее, но InternetReadFile() просто завершается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...