XX-net/XX-Net · warning
roundtrip time:%f transfer_no:%d send:%d recv:%d unpack_erro
Error message
roundtrip time:%f transfer_no:%d send:%d recv:%d unpack_error:%s
What it means
Server error-report with error_code 2: the server could not unpack the request data for the given transfer number. The transfer's data_info is marked 'timeout' and the roundtrip loop continues with other transfers.
Source
Thrown at code/default/x_tunnel/local/proxy_session.py:994
magic, version, pack_type = struct.unpack("<cBB", payload.get(3))
if magic != b"P" or version != g.protocol_version or pack_type not in [2, 3]:
xlog.warn("get data head:%s", utils.str2hex(content[:2]))
data_info["stat"] = "timeout"
time.sleep(sleep_time)
continue
if pack_type == 3: # error report
error_code, message_len = struct.unpack("<BH", payload.get(3))
message = payload.get(message_len)
# xlog.warn("report code:%d, msg:%s", error_code, message)
if error_code == 1:
# no quota
xlog.warn("x_server error:no quota")
self.stop()
return
elif error_code == 2:
# unpack error
xlog.warn("roundtrip time:%f transfer_no:%d send:%d recv:%d unpack_error:%s",
roundtrip_time, transfer_no, send_data_len, len(content), message)
data_info["stat"] = "timeout"
continue
elif error_code == 3:
# session not exist
if self.session_id == request_session_id:
xlog.warn("server session_id:%s not exist, reset session.", request_session_id)
self.reset()
return
else:
xlog.error("unknown error code:%d, message:%s", error_code, message)
time.sleep(sleep_time)
continue
server_time, time_cost, server_send_pool_size, data_len, ack_len, rcvd_no_len, sent_no_len, unack_snd_sn_len, ext_len \
= struct.unpack("<dIIIIIIII", payload.get(40))
head_len = (content_len - data_len - ack_len - rcvd_no_len - sent_no_len - unack_snd_sn_len - ext_len)
if head_len < 3 + 40:View on GitHub (pinned to cfa5bc17b6)
Solutions
- Update XX-Net client so pack/unpack logic matches the server version
- Retry the request — transient corruption marks only this transfer as timeout
- Check network stability (packet loss, middleboxes mangling TLS/stream)
- Report with the logged transfer_no and send/recv lengths if persistent
Defensive patterns
Strategy: retry
Prevention
- Keep client and server versions in sync
- Retry transfers marked 'timeout' — single unpack errors are transient
- Report persistent unpack errors with transfer_no from logs
When it happens
Trigger: Corrupted or truncated request payload (network corruption), protocol/library version mismatch between client and server unpackers, or oversized payloads exceeding server limits.
Common situations: Flaky connections corrupting frames, client/server version skew after partial upgrade, or compression/buffer boundary bugs.
Related errors
AI-assisted analysis of XX-net/XX-Net@cfa5bc17b6 (2026-08-27).
Data as JSON: /api/errors/5cad119a59b7c64c.
Report an issue: GitHub.