4167ea033fead790efdcc0e41050f5d31b4c35b6
- SendAll:发送改为循环直到发完并检查返回值。原实现单次 send 且忽略返回值, 截图这类大响应可能被截断;同时 accept 时补设 SO_SNDTIMEO——响应由 AutoCAD 主线程发送,慢客户端若把 send 卡住会直接拖死 CAD 的 UI。 - RecvOneFrame:去掉"收完 select 探测 150ms 无后续数据即判定整帧"的启发式。 该做法与分片时机强相关,真实网络上分片间隔 >150ms 的大报文会被误截断成 -32700。 改为「零超时 select 探测 + JSON 完整性判定」:数据仍在流式到达时不解析, 与分片间隔无关;且仅在内容以 '}'/']' 收尾时才尝试解析,避免大报文反复解析(O(n^2))。 - 帧超限:不再静默断开,回顶层 -32700。回包后先 shutdown(SD_SEND) 再有界排空剩余 输入再关闭——否则接收缓冲仍有未读数据会触发 RST,可能把刚发出的响应丢掉。 - PostMessage:检查返回值。原实现只在窗口为空时 delete,投递失败(窗口已销毁 / 队列满)会让 TaskData 永久泄漏;现在失败即释放(析构会关闭 socket)。 验证(关 CAD -> 重建 -> 重启后实测): - 新增 verify_mcp_tcp_hardening.py 8/8 PASS:截图 base64 解码为完整 PNG(92175 字节, 含文件头与 IEND);>8MB 帧回 -32700;不带换行的旧式请求仍可用;分片间隔 450ms 不被截断(旧实现会失败);客户端中途断开后基座存活;常规路径无回归。 - 回归:verify_mcp_frame 4/4、verify_mcp_fault_injection 22/22、verify_stdio_bridge 24/24、 verify_annotate 9/9、dwg_review --check 正常。
Languages
Python
69.5%
C++
27.8%
CMake
2.6%