55 lines
1.2 KiB
C++
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); |