2015-04-23 4 views
1

Я хочу просто добавить в мое приложение WebSockets, который использует WinHTTP в режиме async.Асинхронные WebSockets в Winhttp Windows 8

Когда мне нужен WebSocket, я вызываю следующее.

  1. Перед отправкой запроса:

    WinHttpSetOption(context->hRequest, WINHTTP_OPTION_UPGRADE_TO_WEB_SOCKET, NULL, 0); 
    
  2. В WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE:

    appContext->pIoRequest->hWebSocketHandle = WinHttpWebSocketCompleteUpgrade(appContext->hRequest, NULL); 
    WinHttpWebSocketReceive(appContext->pIoRequest->hWebSocketHandle, appContext->pszOutBuffer,RESPONSE_BUFFER_SIZE, NULL, NULL); 
    

все без ошибок.

Теперь я вижу в Fiddler, что сервер отправляет некоторые данные в мой WebSocket, но нет WINHTTP_CALLBACK_STATUS_READ_COMPLETE.

Любые идеи, почему это так? Как я могу читать асинхронно из своего WebSocket? Отправка данных в WebSocket работает хорошо.

ответ

0

Кажется, что веб-порты не получают сообщений PING и PONG для обратного вызова!

1

Omg! Я нашел, как его работа!

  1. Вы должны вызвать дополнительные WinHttpSetStatusCallback установить WebSocket обратного вызова для WebSocketHandle вернулся в WinHttpWebSocketCompleteUpgrade и этот обратный вызов должен затем отличаются тем, что от вызова WinHttpWebSocketCompleteUpgrade был сделан!
  2. Невозможно установить указатель на контекст на WinHttpSetOption с флагом WINHTTP_OPTION_CONTEXT_VALUE! Это не работает. dwContext В WebSocketCallback неверные данные. Позвоните в WinHttpQueryOption в WebSocketCallback, чтобы вернуть неверные данные контекста. Я думаю, что это ошибка в Windows 8.1. Я пишу свой собственный обработчик для подключения моего контекста с помощью WebSocketHandle.

Все это НЕ зарегистрировано в MSDN! Больше всего я не занимался какой-либо информацией об использовании async winhttp websocket ... Итак, я первый =) Я буду очень рад, если мои исследования помогут вам!