【问题标题】:WinHTTP and WebsocketWinHTTP 和 Websocket
【发布时间】:2016-05-05 07:30:12
【问题描述】:

我正在尝试使用 WinHTTP 连接到服务器,不幸的是,当我尝试将协议从 http 升级到 webscoket 时,API WinHttpSetOption 失败。

hSessionHandle    = WinHttpOpen(L"WebSocket sample",WINHTTP_ACCESS_TYPE_NO_PROXY,NULL,  NULL,0);
hConnectionHandle = WinHttpConnect(hSessionHandle, L"localhost",INTERNET_DEFAULT_HTTP_PORT, 0);
hRequestHandle    = WinHttpOpenRequest(hConnectionHandle,L"GET",L"/ws",NULL,NULL,NULL,  0);

// Request protocol upgrade from http to websocket.
fStatus = WinHttpSetOption(hRequestHandle,WINHTTP_OPTION_UPGRADE_TO_WEB_SOCKET,NULL,0);
if (!fStatus)
{
   dwError = GetLastError();
   goto quit;
}

fStatus 返回 FALSE,GetLastError 返回错误代码 12009,表示

ERROR_WINHTTP_INVALID_OPTION
12009:对 WinHttpQueryOption 或 WinHttpSetOption 的请求指定了无效的选项值。

以上代码取自Microsoft WinHttp WebSocket demo(new GitHub home)

我的系统是 Windows 7。操作系统必须是 Windows 8 或更高版本吗?这个 API 的任何线索都失败了?

【问题讨论】:

  • 由于升级完成功能,WinHttpWebSocketCompleteUpgrade明确指定Windows 8为最小平台,我直接说是的,你需要Windows 8或更高版本。
  • 感谢 WhozCraig....有什么方法可以在 Win 7 中将 websockets 与 winHttp 一起使用?

标签: c++ http websocket winhttp


【解决方案1】:

这里有一个很棒的 C++ WebSocket 库,可以在 Windows 7 中运行,它只有标头并且只使用 boost。它带有示例代码和文档: http://vinniefalco.github.io/

这是一个向回显服务器发送消息的完整程序。这将适用于您的 Windows 7。

#include <beast/websocket.hpp>
#include <beast/buffers_debug.hpp>
#include <boost/asio.hpp>
#include <iostream>
#include <string>

int main()
{
    // Normal boost::asio setup
    std::string const host = "echo.websocket.org";
    boost::asio::io_service ios;
    boost::asio::ip::tcp::resolver r(ios);
    boost::asio::ip::tcp::socket sock(ios);
    boost::asio::connect(sock,
        r.resolve(boost::asio::ip::tcp::resolver::query{host, "80"}));

    using namespace beast::websocket;

    // WebSocket connect and send message using beast
    stream<boost::asio::ip::tcp::socket&> ws(sock);
    ws.handshake(host, "/");
    ws.write(boost::asio::buffer("Hello, world!"));

    // Receive WebSocket message, print and close using beast
    beast::streambuf sb;
    opcode op;
    ws.read(op, sb);
    ws.close(close_code::normal);
    std::cout <<
        beast::debug::buffers_to_string(sb.data()) << "\n";
}

【讨论】:

    【解决方案2】:

    你搞定了吗?

    我发现使用“echo.websocket.org”非常适合测试。

    这些也是对我有用的价值观:

    WinHttpOpenRequest( 在 HINTERNET hConnect 中, 在 LPCWSTR pwszVerb 中,---“获取” 在 LPCWSTR pwszObjectName,--- NULL 在 LPCWSTR pwszVersion 中,--- NULL 在 LPCWSTR pwszReferrer,--- WINHTTP_NO_REFERER 在 LPCWSTR *ppwszAcceptTypes,--- WINHTTP_DEFAULT_ACCEPT_TYPES IN DWORD dwFlags --- 0
    );

    【讨论】:

      猜你喜欢
      • 2012-04-10
      • 1970-01-01
      • 2017-05-22
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      相关资源
      最近更新 更多