以下是一个简单的示例代码,用于构建 WebSocket 数据帧并将其发送回客户端:
#include <iostream>#include <cstring>using namespace std;enum Opcode {CONTINUATION_FRAME = 0x00,TEXT_FRAME = 0x01,BINARY_FRAME = 0x02,CONNECTION_CLOSE = 0x08,PING_FRAME = 0x09,PONG_FRAME = 0x0A};enum CloseCode {NORMAL_CLOSURE = 1000,ENDPOINT_GOING_AWAY = 1001,PROTOCOL_ERROR = 1002,UNSUPPORTED_DATA = 1003,NO_STATUS_RCVD = 1005,ABNORMAL_CLOSURE = 1006,INVALID_PAYLOAD = 1007,POLICY_VIOLATION = 1008,MESSAGE_TOO_BIG = 1009,MANDATORY_EXT = 1010,INTERNAL_SERVER_ERR = 1011,TLS_HANDSHAKE = 1015};struct WebSocketFrame {unsigned char fin;unsigned char opcode;unsigned char mask;unsigned char payload_len;unsigned char masking_key[4];unsigned char *payload_data;};void sendWebSocketData(int sockfd, const char* data, int length, Opcode opcode) {WebSocketFrame frame;memset(&frame, 0, sizeof(frame));frame.fin = 1;frame.opcode = opcode;frame.mask = 0; // server to client doesn't need maskingif(length <= 125) {frame.payload_len = length;} else if(length <= 65535) {frame.payload_len = 126;unsigned short len = htons(length);memcpy(frame.payload_data, &len, sizeof(len));} else {frame.payload_len = 127;unsigned long long len = htobe64(length);memcpy(frame.payload_data, &len, sizeof(len));}// allocate memory for the frameint frame_size = sizeof(unsigned char) * (2 + (frame.payload_len > 125 ? (frame.payload_len == 126 ? 2 : 8) : 0)) + length;unsigned char* frame_data = new unsigned char[frame_size];memset(frame_data, 0, frame_size);frame_data[0] |= frame.fin << 7 | frame.opcode;frame_data[1] |= frame.mask << 7 | frame.payload_len;if(frame.payload_len == 126) {memcpy(frame_data+2, &length, sizeof(length));} else if(frame.payload_len == 127) {memcpy(frame_data+2, &length, sizeof(length));}memcpy(frame_data + (2 + (frame.payload_len > 125 ? (frame.payload_len == 126 ? 2 : 8) : 0)), data, length);// send the frame to clientint sent = send(sockfd, frame_data, frame_size, 0);if(sent != frame_size) {cerr << "Error sending WebSocket frame" << endl;}delete[] frame_data;}int main() {int sockfd; // assume the socket has been created and connected to a client// ...const char* message = "Hello, World!";sendWebSocketData(sockfd, message, strlen(message), TEXT_FRAME);// ...return 0;}
这个示例代码演示了如何使用 C++ 构建 WebSocket 数据帧并将其发送回客户端。函数 sendWebSocketData 接受套接字文件描述符、要发送的数据、数据长度和帧类型作为参数。该函数首先根据数据长度确定负载的长度,并构建 WebSocket 帧头部。然后将负载数据复制到 WebSocket 帧中并发送给客户端。
请注意,此示例代码仅演示了如何构建 WebSocket 数据帧。在实际应用中,您需要考虑更多的因素,例如数据的加密和解密、授权等。




