【问题标题】:Tftp protocol implementation and difference between netascii and octecttftp协议实现及netascii和octect的区别
【发布时间】:2011-08-18 00:22:37
【问题描述】:

我正在构建一个应用程序,它是一个实现 tftp 协议的服务器。我很难理解 tftp 中 ASCII 格式和二进制格式(netascii 和 octect)之间的区别,以及我应该如何以不同的方式读取文件作为协议状态。

我知道一个 ASCII 字符可以用一个字节来表示。所以我不明白以 ascii 模式(每个字符 1 个字节)和二进制模式(1 个原始字节)读取有什么区别。

对于二进制模式(tftp 中的八位字节),我可以使用标志 ios::binary 读取文件,而对于 ascii(tftp 中的 netascii),我可以不使用它,但我真的不明白以这两种方式读取文件有什么区别(我总是想出一个字节数组)。

如果有人能帮助我理解,我将不胜感激

tftp协议规范:http://www.rfc-editor.org/rfc/rfc1350.txt

我不明白的部分是这个:

目前支持三种传输模式:netascii(这是 ascii 在“美国信息交换标准代码”中定义
[1] 带有“Telnet 协议
中指定的修改” 规范”[3]。)注意它是 8 位 ascii。术语
本文档中将使用“netascii”来表示此
特定版本的 ascii。);八位字节(这取代了“二进制”模式 本文档以前版本的版本。)原始 8 位字节;邮件,
netascii 字符发送给用户而不是文件。 (邮件
模式已过时,不应实施或使用。)附加
模式可以由成对的合作主机来定义。

【问题讨论】:

    标签: c++ protocols tftp


    【解决方案1】:

    有两个段落可以帮助阐明 netascii 在 RFC-1350/TFTP 中的用途:

    netascii(这是“美国信息交换标准代码”[1] 中定义的 ascii,并在“Telnet 协议规范”[3] 中指定了修改。)

    “Telnet 协议规范”是 RFC-764,它描述了用于“网络虚拟终端”的各种 ASCII 码的解释。因此,netascii 将遵循这些解释(包括行必须以 CR/LF 序列终止)。

    和:

    接收 netascii 模式数据的主机必须将数据转换为自己的格式。

    因此,例如,使用 EBCDIC 作为本机编码的主机可能会将 netascii 转换为该编码,但会单独保留“八位字节”数据。

    如果您在使用 LF 作为行尾的 Unix(或其他)系统上实现 TFTP 服务器,则需要为 netascii 传输添加 CR(以及将文件中的实际 CR 字符转换为CR/NUL 序列。

    【讨论】:

    • 我觉得你的回答不错,就是不明白为什么要把CR转换成CR/NUL而不是CR/LF
    • @Fire-Dragon:CR 不是在 Unix 系统上结束的行(例如,它可能是在 OS/X 之前的 Mac 上)。 telnet 规范说不属于换行符的 CR 必须是 CR/NUL。
    • 哦,非常感谢,这些解释了我为什么不理解它。
    • 主机系统上的文本文件可能被编码为 Unicode/UTF-8。当 TFTP 服务器接收到 ASCII 文本时,它必须存储/转换为 Unicode;当服务器发送文本文件时,它必须将其转换为 ASCII(例如,通过忽略 ASCII 范围之外的 Unicode 字符或将例如变音符号扩展为 ASCII 字符序列;ä -> ae,ç -> c..)。
    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2013-10-15
    • 2017-11-08
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多