81 lines
2.0 KiB
C
81 lines
2.0 KiB
C
|
|
#ifndef CCWEBSOCKETINFO_H
|
||
|
|
#define CCWEBSOCKETINFO_H
|
||
|
|
|
||
|
|
#include "vector"
|
||
|
|
#include "CCString.h"
|
||
|
|
#include "CCSocket.h"
|
||
|
|
#include <cstdint>
|
||
|
|
#include "CCTimeData.h"
|
||
|
|
#include "CCByteArray.h"
|
||
|
|
|
||
|
|
// WebSocket 数据帧结构体
|
||
|
|
struct WebSocketFrame {
|
||
|
|
uint8_t fin : 1; // FIN 标志位
|
||
|
|
uint8_t rsv1 : 1; // RSV1 标志位
|
||
|
|
uint8_t rsv2 : 1; // RSV2 标志位
|
||
|
|
uint8_t rsv3 : 1; // RSV3 标志位
|
||
|
|
uint8_t opcode : 4; // Opcode
|
||
|
|
uint8_t mask : 1; // Mask 标志位
|
||
|
|
uint8_t payload_len : 7; // Payload 长度
|
||
|
|
uint8_t MaskingKey[4] = {0};
|
||
|
|
// 构造函数
|
||
|
|
WebSocketFrame(uint8_t opcode, uint8_t mask, uint64_t payload_len)
|
||
|
|
: fin(1), rsv1(0), rsv2(0), rsv3(0), opcode(opcode), mask(mask), payload_len((uint8_t)(payload_len & 0x7f)) {}
|
||
|
|
|
||
|
|
WebSocketFrame() {
|
||
|
|
fin = 1;
|
||
|
|
rsv1 = 0;
|
||
|
|
rsv2 = 0;
|
||
|
|
rsv3 = 0;
|
||
|
|
opcode = 0;
|
||
|
|
mask = 0;
|
||
|
|
payload_len = 7 & 0x7f;
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
enum WS_ErrorCode{
|
||
|
|
WS_NO_ERROR = 0,
|
||
|
|
WS_PROTOCOL_ERROR = 1,
|
||
|
|
WS_DATA_ERROR = 2
|
||
|
|
};
|
||
|
|
|
||
|
|
class CCWebSocketInfo
|
||
|
|
{
|
||
|
|
public:
|
||
|
|
enum WS_Status
|
||
|
|
{
|
||
|
|
WS_STATUS_CONNECT = 0,
|
||
|
|
WS_STATUS_UNCONNECT = 1,
|
||
|
|
};
|
||
|
|
enum WS_FrameType
|
||
|
|
{
|
||
|
|
WS_EMPTY_FRAME = 0xF0,
|
||
|
|
WS_ERROR_FRAME = 0xF1,
|
||
|
|
WS_TEXT_FRAME = 0x01,
|
||
|
|
WS_BINARY_FRAME = 0x02,
|
||
|
|
WS_PING_FRAME = 0x09,
|
||
|
|
WS_PONG_FRAME = 0x0A,
|
||
|
|
WS_OPENING_FRAME = 0xF3,
|
||
|
|
WS_CLOSING_FRAME = 0x08
|
||
|
|
};
|
||
|
|
WebSocketFrame Frame;
|
||
|
|
std::vector<char> Buffer;
|
||
|
|
WS_ErrorCode ErrorCode = WS_NO_ERROR;
|
||
|
|
private:
|
||
|
|
CCString id = "";
|
||
|
|
CCSocket Client;
|
||
|
|
|
||
|
|
public:
|
||
|
|
void SetId(CCString str);
|
||
|
|
CCString GetId();
|
||
|
|
void SetSocket(CCSocket& socket);
|
||
|
|
CCSocket& GetSocket();
|
||
|
|
bool SendMassage(CCByteArray message,WS_FrameType type = WS_TEXT_FRAME);
|
||
|
|
static bool SendMassage(CCSocket& Client,CCByteArray message,WS_FrameType type = WS_TEXT_FRAME);
|
||
|
|
private:
|
||
|
|
static int wsEncodeFrame(CCByteArray inMessage, CCByteArray &outFrame, enum WS_FrameType frameType);
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
#endif
|