#ifndef CCWEBSOCKETINFO_H #define CCWEBSOCKETINFO_H #include "vector" #include "CCString.h" #include "CCSocket.h" #include #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 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