【问题标题】:Indy TFTP Server Exception EIdTFTPAllocationExceededIndy TFTP 服务器异常 EIdTFTPAllocationExceeded
【发布时间】:2019-01-11 06:52:10
【问题描述】:

在将文件从我(服务器 - 使用 Indy TIdTrivialFTPServer 组件)传输到设备时,我收到 EIdTFTPAllocationExceeded 异常。我找不到有关该异常可能意味着什么的任何信息,除了客户端上的磁盘空间问题(我知道不是这种情况,因为如果我通过不同的 TFTP 服务器传输文件,就没有问题)。

  1. 试图告诉我的异常是什么?
  2. 我该如何解决?
  3. 我是否缺少任何代码?

我的 TFTP 服务器代码(全部)是:

__fastcall TTrivialFTPServer::TTrivialFTPServer(TComponent* Owner) : TDataModule(Owner)
{
    root = IncludeTrailingPathDelimiter(GetCurrentDir());
}

// ---------------------------------------------------------------------------
void __fastcall TTrivialFTPServer::tftpReadFile(TObject *Sender, UnicodeString &FileName, const TPeerInfo &PeerInfo, bool &GrantAccess, TStream *&AStream, bool &FreeStreamOnComplete)
{
    FreeStreamOnComplete = true;
    FileName = StringReplace(FileName, "/", "\\", TReplaceFlags() << rfReplaceAll);
    FileName = ExtractFileName(FileName);
    if (FileExists(root + "files\\" + FileName, false))
    {
        AStream = new TFileStream(root + "files\\" + FileName, fmOpenRead | fmShareDenyWrite);
        GrantAccess = true;
    }
    else
    {
        GrantAccess = false;
    }
}

【问题讨论】:

    标签: c++builder indy tftp


    【解决方案1】:

    经过一番摸索和摸索,我终于打开了 IdTrivialFTPServer.pas 文件并找到了问题所在。代码说明:

    if FBlkCounter = High(UInt16) then begin
        raise EIdTFTPAllocationExceeded.Create('');
    end;
    

    当我将文本添加到异常时,我收到了添加的文本,所以这就是发生错误的地方。我尝试从 UInt16 转换为 UInt32,但导致了更多问题,所以我想看看如果我只是注释掉检查并让计数器回滚到零会发生什么。

    事实证明,没有任何不好的事情发生,文件传输正常!

    【讨论】:

    • 数据块上的 16 位计数器从 1 开始。0 仅在回复传输请求时使用。 TFTP 协议没有定义 16 位计数器在发送 65535 个数据包后应该如何包装(如果有的话)为 0 或 1。每个数据包的默认块大小为 512 字节,因此默认最大文件大小为 32MB。对于较大的文件,客户端在请求文件传输时可以要求更大的块大小,这有效地将最大文件大小增加到 91MB。这是唯一的官方选项。除此之外的任何事情都是非标准行为。见compuphase.com/tftp.htm
    • 我可能决定向 TFTP 组件添加可自定义的选项以控制换行行为。见github.com/IndySockets/Indy/issues/242
    • 两个都有趣。谢谢你。 compuphase 文章讨论了翻转方法以及其他方法。显然,这是在我用于测试目的的商业 TFTP 服务器之一中实现的,也是我无意中在代码中实现的。我认为在属性中提供选项将是最好的选择 - 以及一些关于它是什么以及为什么需要它的文档(上面给出的链接对我很有帮助)。
    猜你喜欢
    • 1970-01-01
    • 2017-02-15
    • 2023-03-30
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    相关资源
    最近更新 更多