在Winsock ws客户端和Websocket服务器之间建立握手

时间:2019-01-05 22:38:15

标签: c++ websocket winsock winsock2

我正在尝试在WinSock客户端和WebSocket回显服务器(在我的情况下为https://www.websocket.org/echo.html的wss://echo.websocket.org)之间进行握手。据我了解,它连接正常,没有错误。当我尝试发送握手标头时也没有错误,但是在接收时我得到0。

一些代码段:

string ipAddress = "174.129.224.73";//echo.websocket ip address
int port = 443;                     // Listening port # on the server

                                        // Initialize WinSock
WSAData data;
WORD ver = MAKEWORD(2, 2);
int wsResult = WSAStartup(ver, &data);

SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);

sockaddr_in hint;
hint.sin_family = AF_INET;
hint.sin_port = htons(port);
inet_pton(AF_INET, ipAddress.c_str(), &hint.sin_addr);

// Connect to server
int connResult = connect(sock, (sockaddr*)&hint, sizeof(hint));

string header = "GET wss://echo.websocket.org/ HTTP/1.1\r\n"
    "Host: echo.websocket.org\r\n"
    "Upgrade: websocket\r\n"
    "Connection: Upgrade\r\n"
    "Sec-WebSocket-Key: BJZcwnjVSapHLie3s8n0yA==\r\n"
    "Origin: http://localhost\r\n"
    "Sec-WebSocket-Protocol: chat, superchat\r\n"
    "Sec-WebSocket-Version: 13\r\n\r\n";

int sendResult = send(sock, header.c_str(), header.length() + 1, 0);

// Do-while loop to send and receive data
char buf[4096];


int bytesReceived = recv(sock, buf, 4096, 0);
....

在这里,recv返回0,但是,如果一切正常,应该返回一个响应头。

所以,现在我被困住了,任何建议都会有很大帮助...

如果有人推荐其他任何本机/轻量级(仅标头)c ++ lib以便轻松使用websockets,我也将非常感谢

谢谢!

1 个答案:

答案 0 :(得分:0)

recv()在远程对等方正常关闭其末端的连接时返回0。

您正在尝试从HTTPS(安全HTTP)端口请求WSS(安全WebSocket)资源。因此,您需要先与服务器完成SSL / TLS握手,然后才能发送WebSocket握手。您未执行SSL / TLS部分,因此服务器会立即断开您的连接。

Winsock没有SSL / TLS的概念。您需要在套接字连接的顶部使用Microsoft的SChannel API或第三方库(如OpenSSL)。

最好使用第三方的WebSocket库为您处理这些详细信息。