Winhttp Windows 8中的异步WebSockets

时间:2015-04-23 16:47:27

标签: asynchronous websocket winhttp

我只想将WebSockets添加到在异步模式下使用WinHTTP的应用。

当我需要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);
    
  3. 一切都没有错误。

    现在我在Fiddler中看到服务器将一些数据发送到我的WebSocket,但没有触发WINHTTP_CALLBACK_STATUS_READ_COMPLETE

    为什么会这样?如何从WebSocket异步读取?将数据发送到WebSocket运行良好。

2 个答案:

答案 0 :(得分:2)

OMG!我找到了它的工作方式!

  1. 你必须调用额外的WinHttpSetStatusCallback来为WebSocketHandle中返回的WinHttpWebSocketCompleteUpgrade设置WebSocket回调,并且这个回调必须与来自WinHttpWebSocketCompleteUpgrade的回调有所不同!
  2. 无法使用WinHttpSetOption标记WINHTTP_OPTION_CONTEXT_VALUE设置上下文指针!它不行。 dwContextWebSocketCallback中有错误的数据。在WinHttpQueryOption中调用WebSocketCallback会返回错误的上下文数据。我认为这是Windows 8.1中的一个BUG。我编写自己的处理程序以将我的上下文与WebSocketHandle连接起来。
  3. 所有这些都没有在MSDN中记录!最重要的是,我没有谷歌任何关于异步winhttp websocket使用的信息...所以,我是第一个=)如果我的研究能帮到你,我将非常高兴!

答案 1 :(得分:0)

似乎websockets没有收到PING和PONG消息给回调!