return -1;
}
+ // ========== 新增:打印收到的所有原始数据 ==========
+ printf("\n=== WebSocket Raw Data Received ===\n");
+ printf("Client: %s:%s\n", client->host, client->path);
+ printf("Total bytes: %zu\n", len);
+ printf("Raw data (hex): ");
+
+ // 打印所有数据的十六进制表示
+ for (size_t i = 0; i < len; i++) {
+ printf("%02X ", data[i]);
+ // 每16字节换行,提高可读性
+ if ((i + 1) % 16 == 0) {
+ printf("\n ");
+ }
+ }
+ printf("\n");
+
+ // 打印ASCII表示(可打印字符)
+ printf("Raw data (ASCII): ");
+ for (size_t i = 0; i < len; i++) {
+ if (data[i] >= 32 && data[i] <= 126) {
+ printf("%c", data[i]);
+ } else if (data[i] == '\r') {
+ printf("\\r");
+ } else if (data[i] == '\n') {
+ printf("\\n");
+ } else if (data[i] == '\t') {
+ printf("\\t");
+ } else {
+ printf(".");
+ }
+ }
+ printf("\n");
+
+ // 打印数据统计信息
+ // printf("Data analysis:\n");
+ // printf(" - Total bytes: %zu\n", len);
+ // printf(" - First byte: 0x%02X\n", len > 0 ? data[0] : 0);
+ // printf(" - Last byte: 0x%02X\n", len > 0 ? data[len-1] : 0);
+
+ // 检查是否可能是WebSocket帧头
+ // if (len >= 2) {
+ // uint8_t first_byte = data[0];
+ // uint8_t second_byte = data[1];
+ // uint8_t fin = (first_byte >> 7) & 0x1;
+ // uint8_t rsv = (first_byte >> 4) & 0x7;
+ // uint8_t opcode = first_byte & 0x0F;
+ // uint8_t mask = (second_byte >> 7) & 0x1;
+ // uint8_t payload_len = second_byte & 0x7F;
+
+ // printf(" - Potential WebSocket frame:\n");
+ // printf(" * FIN: %d\n", fin);
+ // printf(" * RSV: %d%d%d\n", (rsv >> 2) & 1, (rsv >> 1) & 1, rsv & 1);
+ // printf(" * Opcode: 0x%02X\n", opcode);
+ // printf(" * Mask: %d\n", mask);
+ // printf(" * Payload length: %d\n", payload_len);
+
+ // // 验证opcode是否有效
+ // bool valid_opcode = ((opcode <= 0x2) || (opcode >= 0x8 && opcode <= 0xA));
+ // printf(" * Valid opcode: %s\n", valid_opcode ? "YES" : "NO");
+
+ // // 验证RSV位
+ // bool valid_rsv = (rsv == 0);
+ // printf(" * Valid RSV: %s\n", valid_rsv ? "YES" : "NO");
+ // }
+ printf("=====================================\n\n");
+
ws_parser_t* parser = client->parser;
int total_processed = 0;
const uint8_t* current_data = data;
// 使用新的解析器处理当前数据段
int result = ws_parse_stream(parser, current_data, remaining_len);
-
+
+ if(result == -1)
+ {
+ printf("ws_process_received_data: parsing error, reset parser,find next frame. Remaining: %zu bytes\n", remaining_len);
+ ws_parser_reset(parser);
+ return -1;
+ }
+
+ // 更新处理进度
+ total_processed += result;
+ current_data += result;
+ remaining_len -= result;
+
// 在解析后打印解析器状态
printf("ws_process_received_data: parser state after parsing:\n");
// ws_parser_debug_state(parser);
+ ws_parse_state_t ws_stat = ws_parser_get_state(parser);
- if (result > 0) {
+ if (ws_stat == WS_STATE_COMPLETE) {
// 解析完成一个完整的WebSocket帧
const ws_header_t* header = ws_get_header(parser);
const uint8_t* payload = ws_get_payload(parser);
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);
return -1;
}
- } else if (result == 0) {
- // 数据不完整,继续等待更多数据
- printf("ws_process_received_data: frame incomplete, waiting for more data\n");
- total_processed = len; // 所有数据都被消耗
- break;
+ } else if (ws_stat == WS_STATE_ERROR) {
+ // 解析错误,重置parser
+ ws_parser_reset(parser);
+
+ printf("ws_process_received_data: parsing error, find next frame. Remaining: %zu bytes\n", remaining_len);
} else {
- // 解析错误
- printf("ws_process_received_data: parsing error, result=%d\n", result);
- return -1;
+ // 数据不完整,继续等待更多数据
+ printf("ws_process_received_data: frame incomplete, waiting for more data\n");
}
}
parser->header.rsv3 = (byte >> 4) & 0x1;
parser->header.opcode = (ws_opcode_t)(byte & 0x0F);
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "WS: Parse header1 - FIN:%d, RSV:%d%d%d, OPCODE:0x%02X",
- parser->header.fin, parser->header.rsv1, parser->header.rsv2, parser->header.rsv3, parser->header.opcode);
+
+
+
+ // WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "WS: Parse header1 - FIN:%d, RSV:%d%d%d, OPCODE:0x%02X",
+ // parser->header.fin, parser->header.rsv1, parser->header.rsv2, parser->header.rsv3, parser->header.opcode);
+
// 检查 opcode 是否有效
if (!((parser->header.opcode >= WS_CONTINUATION && parser->header.opcode <= WS_BINARY) ||
(parser->header.opcode >= WS_CLOSE && parser->header.opcode <= WS_PONG))) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WS: Invalid opcode: 0x%02X", parser->header.opcode);
+ // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WS: Invalid opcode: 0x%02X", parser->header.opcode);
parser->state = WS_STATE_ERROR;
return -1;
}
-
+
+ if(parser->header.fin == 0)
+ {
+ // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WS: Invalid FIN bit: %d", parser->header.fin);
+ // parser->state = WS_STATE_ERROR;
+ // return -1;
+ }
// 检查RSV位是否都为0(根据RFC6455规范)
if (parser->header.rsv1 || parser->header.rsv2 || parser->header.rsv3) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WS: Invalid RSV bits: %d%d%d",
- parser->header.rsv1, parser->header.rsv2, parser->header.rsv3);
- parser->state = WS_STATE_ERROR;
- return -1;
+ // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WS: Invalid RSV bits: %d%d%d",
+ // parser->header.rsv1, parser->header.rsv2, parser->header.rsv3);
+ // parser->state = WS_STATE_ERROR;
+ // return -1;
}
// 保存第一个头部字节到缓存
parser->buffer[parser->buffer_pos++] = byte;
} else {
parser->state = WS_STATE_ERROR;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WS: Buffer overflow in header1");
return -1;
}
parser->buffer[parser->buffer_pos++] = byte;
} else {
parser->state = WS_STATE_ERROR;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WS: Buffer overflow in header2");
return -1;
}
parser->buffer[parser->buffer_pos++] = byte;
} else {
parser->state = WS_STATE_ERROR;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WS: Buffer overflow in payload length");
return -1;
}
parser->buffer[parser->buffer_pos++] = byte;
} else {
parser->state = WS_STATE_ERROR;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WS: Buffer overflow in mask");
return -1;
}
WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "WS: Parser was in COMPLETE state, resetting for new frame");
ws_parser_reset(parser);
}
-
- for (size_t i = 0; i < len; i++) {
+ size_t i=0;
+ for (i = 0; i < len; i++) {
int result = ws_parse_byte(parser, data[i]);
if (result == 1) {
// 重要:不要在这里重置解析器!
// 让上层处理完数据后再调用 ws_parser_reset()
// 这样可以确保数据被正确处理后再清理状态
- return packet_len;
+ return i+1;
} else if (result == -1) {
// 解析错误,重置解析器
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WS: Parse error at byte %zu, resetting parser", i);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WS: Parse error at byte %zu, resetting parser, byte: %02X", i, data[i]);
ws_parser_reset(parser);
- return -1;
+ continue;
}
}
// 未完成解析,显示当前状态信息
WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "WS: Frame parsing incomplete, waiting for more data. State: %d, Buffer: %zu/%zu, Payload remaining: %zu",
parser->state, parser->buffer_pos, WS_BUFFER_SIZE, parser->payload_remaining);
- return 0;
+ return i+1;
}
// 新增:打印解析器详细状态信息(用于调试)