#pragma once #include #include "gsock.h" // 获取Sec-WebSocket-Key的结果 std::string GetResponseKey(const std::string& key); // 完成Websocket握手过程(http头获取和发送) // 返回值: // 0 握手成功 // -1 网络连接中断 // -2 请求的不是websocket协议/非法的ws请求 int Handshake(sock& s); // WebSocket数据帧 struct WSFrame { // 1 bit bool fin; // 1 bit bool rsv1, rsv2, rsv3; // 0x0 附加数据帧 // 0x1 文本数据帧 // 0x2 二进制数据帧 // 0x3~7 保留 // 0x8 连接关闭 // 0x9 ping // 0xA pong // 0xB~F 保留 // 4 bit int opcode; // 1 bit bool ismask; unsigned long long len; // 4 byte char mask[4]; // data是未经过编码处理的数据(如果源数据是带掩码的则已经经过解掩码处理) std::string data; }; // 读写单个数据帧 int ReadFrame(sock& s, WSFrame& f); int SendFrame(sock& s, const WSFrame& f); // 发送对ping的响应 int SendPong(sock& s, const WSFrame& ping); // 读写数据 // 读取时可能会读取多个数据帧,同时也会自动对ping包进行响应. // 写入时不会分为多个数据帧. int ReadMsg(sock& s, std::string& out_data); int SendMsg(sock& s, const std::string& data, bool is_text = true);