}
ws_parser_t* parser = client->parser;
- int processed = 0;
+ int total_processed = 0;
+ const uint8_t* current_data = data;
+ size_t remaining_len = len;
printf("ws_process_received_data: processing %zu bytes for client %s:%s\n",
len, client->host, client->path);
- // 在解析前打印当前解析器状态
- printf("ws_process_received_data: parser state before parsing:\n");
- // ws_parser_debug_state(parser);
-
- // 使用新的解析器处理数据
- int result = ws_parse_stream(parser, data, len);
-
- // 在解析后打印解析器状态
- printf("ws_process_received_data: parser state after parsing:\n");
- // ws_parser_debug_state(parser);
-
- if (result > 0) {
- // 解析完成一个完整的WebSocket帧
- const ws_header_t* header = ws_get_header(parser);
- const uint8_t* payload = ws_get_payload(parser); // 使用新函数获取纯载荷数据
- size_t payload_len = ws_get_payload_length(parser); // 获取载荷长度
+ // 循环处理数据,支持连续帧
+ while (remaining_len > 0) {
+ printf("ws_process_received_data: processing remaining %zu bytes, current offset: %zu\n",
+ remaining_len, current_data - data);
+
+ // 在解析前打印当前解析器状态
+ printf("ws_process_received_data: parser state before parsing:\n");
+ // ws_parser_debug_state(parser);
- printf("ws_process_received_data: frame complete, total bytes: %d, payload bytes: %zu\n",
- result, payload_len);
+ // 使用新的解析器处理当前数据段
+ int result = ws_parse_stream(parser, current_data, remaining_len);
- if (header && payload && payload_len > 0) {
- printf("WebSocket frame received: opcode=0x%02X, fin=%d, payload_len=%llu\n",
- header->opcode, header->fin, header->payload_len);
+ // 在解析后打印解析器状态
+ printf("ws_process_received_data: parser state after parsing:\n");
+ // ws_parser_debug_state(parser);
+
+ if (result > 0) {
+ // 解析完成一个完整的WebSocket帧
+ const ws_header_t* header = ws_get_header(parser);
+ const uint8_t* payload = ws_get_payload(parser);
+ size_t payload_len = ws_get_payload_length(parser);
- // 打印载荷数据的前几个字节(用于调试)
- printf("Payload data (first 32 bytes): ");
- for (size_t i = 0; i < payload_len && i < 32; i++) {
- printf("%02X ", payload[i]);
- }
- if (payload_len > 32) printf("...");
- printf("\n");
+ printf("ws_process_received_data: frame complete, total bytes: %d, payload bytes: %zu\n",
+ result, payload_len);
- // 根据操作码处理不同类型的消息
- switch (header->opcode) {
- case WS_PING:
- printf("Received WebSocket PING\n");
- // TODO: 自动回复PONG
- break;
-
- case WS_PONG:
- printf("Received WebSocket PONG\n");
- break;
-
- case WS_CLOSE:
- printf("Received WebSocket CLOSE\n");
- // 调用回调函数处理关闭帧
- if (client->packet_callback) {
- client->packet_callback((uint8_t*)payload, payload_len, (WebSocketMessageType)WS_CLOSE);
- }
- break;
-
- case WS_TEXT:
- case WS_BINARY:
- case WS_CONTINUATION:
- // 调用回调函数处理数据包
- if (client->packet_callback) {
- WebSocketMessageType ws_type = (header->opcode == WS_TEXT) ? (WebSocketMessageType)WS_TEXT :
- (header->opcode == WS_BINARY) ? (WebSocketMessageType)WS_BINARY : (WebSocketMessageType)WS_CONT;
- client->packet_callback((uint8_t*)payload, payload_len, ws_type);
+ if (header && payload) {
+ printf("WebSocket frame received: opcode=0x%02X, fin=%d, payload_len=%llu\n",
+ header->opcode, header->fin, header->payload_len);
+
+ // 打印载荷数据的前几个字节(用于调试)
+ if (payload_len > 0) {
+ printf("Payload data (first 32 bytes): ");
+ for (size_t i = 0; i < payload_len && i < 32; i++) {
+ printf("%02X ", payload[i]);
}
- break;
-
- default:
- printf("Unknown WebSocket opcode: 0x%02X\n", header->opcode);
- break;
+ if (payload_len > 32) printf("...");
+ printf("\n");
+ }
+
+ // 根据操作码处理不同类型的消息
+ switch (header->opcode) {
+ case WS_PING:
+ printf("Received WebSocket PING\n");
+ // TODO: 自动回复PONG
+ break;
+
+ case WS_PONG:
+ printf("Received WebSocket PONG\n");
+ break;
+
+ case WS_CLOSE:
+ printf("Received WebSocket CLOSE\n");
+ // 调用回调函数处理关闭帧
+ if (client->packet_callback) {
+ client->packet_callback((uint8_t*)payload, payload_len, (WebSocketMessageType)WS_CLOSE);
+ }
+ break;
+
+ case WS_TEXT:
+ case WS_BINARY:
+ case WS_CONTINUATION:
+ // 调用回调函数处理数据包
+ if (client->packet_callback) {
+ WebSocketMessageType ws_type = (header->opcode == WS_TEXT) ? (WebSocketMessageType)WS_TEXT :
+ (header->opcode == WS_BINARY) ? (WebSocketMessageType)WS_BINARY : (WebSocketMessageType)WS_CONT;
+ client->packet_callback((uint8_t*)payload, payload_len, ws_type);
+ }
+ break;
+
+ default:
+ printf("Unknown WebSocket opcode: 0x%02X\n", header->opcode);
+ break;
+ }
+
+ // 重要:在数据处理完成后再重置解析器状态
+ // 这样可以确保数据被正确处理后再清理状态
+ printf("ws_process_received_data: data processing complete, resetting parser\n");
+ ws_parser_reset(parser);
+
+ // 更新处理进度
+ total_processed += result;
+ current_data += result;
+ remaining_len -= result;
+
+ printf("ws_process_received_data: frame processed, moving to next frame. Remaining: %zu bytes\n", remaining_len);
+
+ } else {
+ printf("ws_process_received_data: invalid payload data - header=%p, payload=%p, payload_len=%zu\n",
+ header, payload, payload_len);
+ return -1;
}
- // 重要:在数据处理完成后再重置解析器状态
- // 这样可以确保数据被正确处理后再清理状态
- printf("ws_process_received_data: data processing complete, resetting parser\n");
- ws_parser_reset(parser);
+ } else if (result == 0) {
+ // 数据不完整,继续等待更多数据
+ printf("ws_process_received_data: frame incomplete, waiting for more data\n");
+ total_processed = len; // 所有数据都被消耗
+ break;
+
} else {
- printf("ws_process_received_data: invalid payload data - header=%p, payload=%p, payload_len=%zu\n",
- header, payload, payload_len);
- processed = -1;
+ // 解析错误
+ printf("ws_process_received_data: parsing error, result=%d\n", result);
+ return -1;
}
-
- processed = result;
- } else if (result == 0) {
- // 数据不完整,继续等待
- printf("ws_process_received_data: frame incomplete, waiting for more data\n");
- processed = len;
- } else {
- // 解析错误
- printf("ws_process_received_data: parsing error, result=%d\n", result);
- processed = -1;
}
- return processed;
+ printf("ws_process_received_data: total processed: %d bytes\n", total_processed);
+ return total_processed;
}
// 多余的函数已移除,现在只使用一个统一的解析器