2016-05-05 50 views
0

我想使用WinHTTP連接到服務器,不幸的是,當我試圖從http升級到webscoket時,API WinHttpSetOption失敗。WinHTTP和Websocket

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 demonew GitHub home

我的系統是採取的Windows 7是否操作系統需要是Windows 8的或以上?這個API的任何線索都失敗了?

+0

由於升級完成函數,['WinHttpWebSocketCompleteUpgrade'](https://msdn.microsoft.com/en-us/library/windows/desktop/hh707326(V = vs.85)的.aspx)清楚地將Windows 8指定爲最小平臺,我將繼續說,是的,你需要Windows 8或更高版本。 – WhozCraig

+0

感謝WhozCraig ....有沒有什麼辦法可以在Win 7中使用winHttp的websockets? – Sukhas

回答

4

這裏有一個非常棒的C++ WebSocket庫,它可以在Windows 7中工作,它只有頭文件並且只是用於提升。它帶有示例代碼和文檔: http://vinniefalco.github.io/

這是一個完整的程序,它向echo服務器發送消息。這將在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"; 
}