Как установить контекст для асинхронного вызова WinHttpWebSocketSend? - PullRequest
0 голосов
/ 23 сентября 2018

WinHttpSendRequest имеет параметр dwContext, так что я могу читать контекст из функции WINHTTP_STATUS_CALLBACK.Этот контекст позволяет определить, какой WinHttpSendRequest предназначен для текущего обратного вызова.

К сожалению и странно, однако, WinHttpWebSocketSend НЕ имеет такого параметра контекста вообще.В результате невозможно различить несколько вызовов WinHttpWebSocketSend в функции WINHTTP_STATUS_CALLBACK.

Может кто-нибудь помочь мне с этим, пожалуйста?

Для справки, я пытаюсь изменить следующий примердля работы с веб-сокетом.

https://msdn.microsoft.com/en-us/library/aa383138%28VS.85%29.aspx#additional

Ресурс веб-сокета, который я пытаюсь получить: https://api.upbit.com/websocket/v1. После подключения вы можете отправить следующую строку ресурса для тестирования:

[{"ticket": "test"}, {"format": "SIMPLE"}, {"type": "trade", "codes": ["KRW-BTC","BTC-BCH"]}, {"format": "SIMPLE"}]

Если все пойдет хорошо, вы получите:

{"mk":"KRW-BTC", "ТМС": 1523531768829, "ТД": "2018-04-12", "ТТМ": "11:16:03", "ttms": 1523531763000, "ф": 7691000,0, "тв": 0.00996719," ab ":" BID "," pcp ": 7429000.00000000," c ":" RISE "," cp ": 262000.00000000," sid ": 1523531768829000," st ":" SNAPSHOT "} {" mk ": "BTC-МПБ", "ТМС": 1523531745481, "тд": "2018-04-12", "ТТТ": "11:15:48", "ttms": 1523531748370, "TP": 0.09601999,»тВ ": 0.18711789,"ab": "BID", "pcp": 0.09618000, "c": "FALL", "cp": 0.00016001, "sid": 15235317454810000, "st": "SNAPSHOT"} {"mk": "KRW-BTC», "ТМС": 1523531769250, "тд": "2018-04-12", "ТТТ": "11:16:04", "ttms": 1523531764000, "TP": 7691000.0, "TV": 0,07580113, "ab": "BID", "pcp": 7429000.00000000, "c": "RISE", "cp": 262000.00000000, "sid": 1523531769250000, "st": "REALTIME"}

У меня есть исходный файл проекта, который вы можете скачать: https://1drv.ms/u/s!AiVorOunaPYdhAuHrggDk2EYa2X7

Как только вы загрузите, скомпилируйте и запустите его.Затем вы увидите диалоговое окно с кнопкой «Скачать», в котором будет отображаться - http://www.microsoft.com - флажок WebSocket отключен

При нажатии кнопки «Загрузка» отобразится асинхронный WinHttpSendRequest, работающий с обычным сайтом, таким как http://www.microsoft.com.

Я хотел изменить эту демонстрационную программу для сервера веб-сокетов (https://api.upbit.com/websocket/v1). Для этого я # # define'd WSS_API_UPBIT Далее, раскомментируйте строку 19 AsynchDemo.cpp до

define WSS_API_UPBIT

Затем снова запустите демонстрацию. На этот раз вы увидите немного другой диалог с - https://api.upbit.com/websocket/v1 - флажок WebSocket включен

Теперь установите флажок Websocket и нажмитеЗагрузка. Она не будет работать из-за отсутствия контекста в обратных вызовах.

thx

1 Ответ

0 голосов
/ 12 декабря 2018

Я думаю, что это то, для чего https://docs.microsoft.com/en-us/windows/desktop/api/winhttp/nf-winhttp-winhttpwebsocketcompleteupgrade - вы передаете новый контекст, который специально предназначен для веб-сокета [убедитесь, что вы установили опцию winhttp на дескрипторе перед отправкой - здесь есть пример в синхронном режимеэто может помочь: https://github.com/Microsoft/Windows-classic-samples/blob/master/Samples/WinhttpWebsocket/cpp/WinhttpWebsocket.cpp). Я также думаю, что вам нужно установить опцию функции обратного вызова для дескриптора, возвращенного из CompleteUpgrade (), чтобы получать уведомления после завершения чтения и записи.

...