DHCP/BOOTP/TFTP 中的文件名字符串读取请求显示额外字符

Filename string in DHCP/BOOTP/TFTP Read Request presenting extra characters

在构建基本 Windows 图像部署解决方案(使用 WinPE 和 C# 中构建的自定义应用程序)时,我遇到了 2 台计算机不在同一 subnet/IP 网段(无静态IP 地址或 DHCP 服务器和 DNS/Routing 表)。为了解决这个问题,我编写了一个基本但成功的 DHCP 解决方案,并将其扩展到 TFTP,以便在 C# 中进行远程启动。

此应用程序是使用 RFC 1350、4578 中的指南实现的,并在 RFC 2347 中引用了协商的开始。我已经设法编写了一个将请求的文件发送到远程应用程序的例程。

我已使用 Wireshark 应用程序检查我的外发消息,发现 DHCPOFFER 和 DHCPACK 响应格式不正确。这些已得到更正,但给我留下了 TFTP 实施问题。

客户端计算机正在请求提供的引导文件名,但在表示文件名字符串结尾的 0 字节之前的名称中附加了额外的字节。请参阅下面我从 TFTP 读取请求 (RRQ) 消息中提取文件名的代码摘录:

switch(datagram[1]) //position of OpCode Indicator
{
        case (byte)TFTP_OpCode.RRQ
        {
            TidPort = new Random();
            var port = TidPort.New(65200, 65350); // Server TX ID & Port
            offset = offset + 1;
            int strlength = 0;
            while (datagram[offset] != (byte)0)
            {
                strlengeth++;
                offset++
            }
            byte[] tmpbytes = new byte[strlength -1];
            Array.Copy(datagram, 2, tmpbytes, 0, strlength -1)
        }
}

其中 'datagram' 是使用 UDP 套接字接收的字节数组。

将字符串转换为字节数组以传入 DHCPOFFER/ACK 消息的代码:

switch (option)
    {
        case BOOTFILE:
            {
            byte[] tmpbytes = new byte[Encoding.ASCII.GetByteCount("pxeboot.n12")];
            tmpbytes = Encoding.ASCII.GetBytes("pxeboot.n12");
            _totalLength = tmpbytes.Length + 2;
            _option = new byte[_totalLength];
            _option[0] = (byte)BOOTFILE;
            _option[1] = (byte)tmpbytes.Length;
            Array.Copy(tmpbytes, 0, _option, 2, tmpbytes.Length);
            Array.Copy(_option, 0, result, optionPosition, _option.Length);
            optionPosition = optionPosition + _totalLength;
            break;
            }
    }

在 console.WriteLine() 中使用 Encoding.ASCII.getString(tmpbytes[]) 时,我得到了 'pxeboot.n12?'。 Pre Wireshark 和消息更正之前,我能够从 TFTP RRQ 中正确提取引导文件名(在本例中为 pxeboot.n12),但它会在 TFTP 请求 BCD 文件(位于 "Boot\BCD" 中)时失败。

当我能够正确提取文件名时(每个文件,每次),是否还有其他我应该传回的选项(即选项 93、94 和 97(系统架构、网络 ID 版本、UUID/GUID) 或选项 253(在使用另一个 DHCP/TFTP 解决方案的 Wireshark 中注意到)?

我不得不使用 string.SubString() 方法:

string filestring = Encoding.ASCII.GetString(tmpbytes); int pos = filestring.IndexOf("?"); filestring = filstring.SubString(0, pos-1);

从 tmpbytes 数组中删除不需要的字符。

选项 93、94 和 97 现在在 DHCPOFFER 消息中传回 post 请求的选项。 DHCP 和 TFTP 实施现在都按预期工作。