首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DHCP/BOOTP/TFTP读取请求中显示额外字符的文件名字符串

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

Stack Overflow用户
提问于 2019-02-21 21:39:02
回答 1查看 183关注 0票数 1

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

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

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

客户端计算机正在请求提供的启动文件名,但在表示文件名字符串结束的0字节之前将额外的字节附加到该名称。有关从TFTP Read Request (RRQ)消息中提取文件名的信息,请参阅以下代码摘录:

代码语言:javascript
复制
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消息的代码:

代码语言:javascript
复制
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?‘。在Wireshark和消息传递修正之前,我能够正确地从TFTP RRQ中提取引导文件名(在本例中为pxeboot.n12),但在TFTP请求BCD文件(位于“boot”中)时会失败。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-01 08:26:05

我不得不使用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实施现在都能按预期工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54808455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档