首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++ -- WebSockets是否强制加密,如何获取“明文”?

C++ -- WebSockets是否强制加密,如何获取“明文”?
EN

Stack Overflow用户
提问于 2016-10-19 23:57:16
回答 2查看 522关注 0票数 0

我的朋友正在学习如何在他的web服务器上处理WebSockets,所以我决定尝试并学习如何将我的HTTP/1.1连接升级到已经成功工作的WebSockets!但我发送关于新的websocket协议的数据,但我检索的信息是加密/压缩等。

所以我的问题是

  1. 数据是加密/压缩的吗?
  2. 我怎样才能检索明文呢?
  3. WebSockets是否像TCP连接?(我知道WebSockets是建立在TCP上的)但是我知道它们支持双向流,所以我估计明文会被接收。

代码:(这根本没有调试,因为我只是快速地启动它来连接到一个WebSocket回送服务器,我发现它与Fiddler混在一起)

代码语言:javascript
运行
复制
    int main()
{
WSADATA WsaData = { 0 };
WSAStartup(MAKEWORD(2, 2), &WsaData);

addrinfo hints = { 0 }, *results = nullptr;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_socktype = SOCK_STREAM;
hints.ai_family = AF_INET;

getaddrinfo("echo.websocket.org", "80", &hints, &results);

SOCKET hSocket = socket(results->ai_family, results->ai_socktype, results->ai_protocol);
connect(hSocket, results->ai_addr, static_cast<int>(results->ai_addrlen));

std::string SendBuffer;
SendBuffer = "GET http://echo.websocket.org HTTP/1.1\r\n";
SendBuffer += "Host: echo.websocket.org\r\n";
SendBuffer += "Upgrade: websocket\r\n";
SendBuffer += "Connection: Upgrade\r\n";
SendBuffer += "Origin: http://www.websocket.org\r\n";
SendBuffer += "Sec-WebSocket-Key: BBw/08+HrO3UfLPU/jeq1g==\r\n";
SendBuffer += "Sec-WebSocket-Version: 13\r\n";
SendBuffer += "Sec-WebSocket-Protocol: chat\r\n\r\n";


char RecvBuffer[1024], MessageBuffer[50];
int ReturnCode = 0;
ReturnCode = send(hSocket, SendBuffer.c_str(), SendBuffer.length(), 0);
ReturnCode = recv(hSocket, RecvBuffer, 5000, 0);

ReturnCode = send(hSocket, "Hello!", 7, 0);
ReturnCode = recv(hSocket, MessageBuffer, 50, 0);


    return 0;
}

WebSocket协议-升级响应:

代码语言:javascript
运行
复制
HTTP/1.1 101 Web Socket Protocol Handshake
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Headers: authorization
Access-Control-Allow-Headers: x-websocket-extensions
Access-Control-Allow-Headers: x-websocket-version
Access-Control-Allow-Headers: x-websocket-protocol
Access-Control-Allow-Origin: http://www.websocket.org
Connection: Upgrade
Date: Wed, 19 Oct 2016 23:54:17 GMT
Sec-WebSocket-Accept: 6+RXVMNG1sZqeIs/Y1tlISzHAFI=
Server: Kaazing Gateway
Upgrade: websocket

向WebSocket响应发送数据:

代码语言:javascript
运行
复制
\x2\x3\ê
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-20 01:06:17

请阅读RFC 6455,它定义了WebSocket协议。特别是第5节:数据框架第6节:发送和接收数据

WebSocket不是纯文本协议.它实际上是一种使用框架消息的二进制协议,它可能包含文本数据:

在成功的握手之后,客户端和服务器以本规范中称为“消息”的概念单元来回传输数据。在线路上,消息由一个或多个帧组成。WebSocket消息不一定对应于特定的网络层帧,因为碎片消息可能由中间层合并或拆分。 框架具有关联类型。属于同一消息的每个帧包含相同类型的数据。广义地说,有文本数据(被解释为UTF-8 RFC3629文本)、二进制数据(其解释由应用程序决定)和控制帧(它们不打算为应用程序携带数据,而是用于协议级别的信令,例如表示连接应该关闭)的类型。该协议的这个版本定义了六种帧类型,并保留了十种供将来使用。

您的代码根本没有考虑到这一点。就套接字代码而言,唯一的纯文本部分是最初的HTTP升级握手。握手完成后,您必须发送和接收框架二进制消息。不幸的是,框架化过程有点复杂。

最好的选择是根本不手动实现WebSocket,而是使用现有的WebSocket库,例如libwebsocketsWebSocket++舒畅等。

票数 3
EN

Stack Overflow用户

发布于 2016-10-20 00:05:53

在升级响应中,您将显式地告诉服务器您允许压缩:

代码语言:javascript
运行
复制
SendBuffer += "Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits\r\n\r\n";

如果不需要压缩,请删除permessage-deflate扩展。

https://en.wikipedia.org/wiki/DEFLATE

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40143376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档