我正在开发 X11 的代理服务器,它还会对某些数据进行一些轻微的数据操作(颜色深度、水印等等)。我已经建立并运行了连接,并且正在操作 177/UDP 连接中的服务器 IP,以便客户端通过代理正确连接,而不是调用服务器。换句话说,我有一个功能齐全的代理,可以通过端口 6000 将数据从客户端代理到服务器。
我现在尝试做的是解析数据流并找到每条消息的开头和类型,以清除我将要从需要操作的数据中传递的数据。然而,我很早就遇到了障碍。
我从客户端获得的数据是带有字节顺序的单个字节(在我的例子中为“B”,但我让它支持两者),后跟主要版本(3)的 2 个字节和用于主版本(3)的 2 个字节次要版本(11)。这两者在协议规范中都被指定为 CARD16 (https://www.rfc-editor.org/rfc/rfc1013)。 接下来是 AuthorizationName,表示要使用的授权类型,类型为 STRING8。 STRING8 在文档中被指定为 LISTOFCARD8,表示 8 位无符号整数的列表。
问题就在这里:我根本不知道 LISTOFCARD8 有多长。 规范中的片段:“长度字段的大小可能会有所不同(它不是 必须与 FOO 大小相同),在某些情况下可能是隐式的, 并且本文件中未详细说明。”。
我得到的实际数据,从数据流中的字节 5 开始,是 0 0 12 0 10 0 0,然后是实际数据流(ASCII 字符串“MIT-MAGIC-COOKIE-1”)。我无法从它前面的字节中找出有效的字符串长度,并且字符串本身似乎不是以 null 结尾的。
所以,对于我的问题,如果还没有遇到过:我如何确定 ListOfFOO 的长度,或者更具体地说是 ListOfCARD8,如 RFC 1013 中规定的?
谢谢! // 埃里克·约翰逊
RFC 1013 是 X11 协议规范的一个从未使用过、长期过时的预发布版本,应在阅读前烧录并且从未使用过。
当前正确的 X11 协议规范可以在 http://www.x.org/releases/X11R7.7/doc/xproto/x11protocol.html 或 http://www.x.org/releases/ 找到X11R7.7/doc/xproto/x11protocol.pdf
这在 X Window 系统协议,附录 B“协议编码”,“连接设置”部分中指定。
摘录如下:
1 byte-order
#x42 MSB first
#x6C LSB first
1 unused
2 CARD16 protocol-major-version
2 CARD16 protocol-minor-version
2 n length of authorization-protocol-name
2 d length of authorization-protocol-data
2 unused
n STRING8 authorization-protocol-name
p unused, p=pad(n)
d STRING8 authorization-protocol-data
q unused, q=pad(d)