LibWS/websocket.h

55 lines
1.2 KiB
C++

#pragma once
#include <string>
#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);