2016-05-05 34 views
0

Ich versuche, WinHTTP verwenden, um eine Verbindung zum Server herzustellen, leider, wenn ich versuche, das Protokoll von http zu Webskorb zu aktualisieren, scheitert die API WinHttpSetOption.WinHTTP und 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 kehrt FALSCH, mit GetLastError Fehlercode 12009 Rückkehr der

ERROR_WINHTTP_INVALID_OPTION
12009 sagt: Eine Anfrage an WinHttpQueryOption oder WinHttpSetOption angegeben einen ungültigen Wert Option.

Der obige Code wird aus dem Microsoft WinHttp WebSocket demogenommen (new GitHub home)

Mein System ist Windows 7. Ist das Betriebssystem Windows 8 oder höher sein müssen? Irgendwelche Hinweise dieser API scheitern?

+0

Seit dem Upgrade Vervollständigungsfunktion, [ 'WinHttpWebSocketCompleteUpgrade'] (https://msdn.microsoft.com/en-us/library/windows/desktop/hh707326 (v = VS.85) .aspx) deutlich spezifiziert Windows 8 als die minimale Plattform, ich gehe voran und sage ja, Sie brauchen Windows 8 oder höher. – WhozCraig

+0

Danke WhozCraig .... Gibt es eine Möglichkeit, wie wir Websockets mit winHttp in Win 7 verwenden können? – Sukhas

Antwort

4

Es gibt eine großartige C++ WebSocket-Bibliothek hier, die in Windows 7 funktioniert, nur in der Kopfzeile und nur Boost verwendet. Es kommt mit Beispielcode und Dokumentation: http://vinniefalco.github.io/

Hier ist ein komplettes Programm, das eine Nachricht an den Echo-Server sendet. Dies funktioniert in Windows 7 für Sie.

#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"; 
}