【问题标题】:IdFTP in XE5 Android app, is 16 a magic number?XE5 Android应用程序中的IdFTP,16是一个神奇的数字吗?
【发布时间】:2013-10-22 05:59:37
【问题描述】:

我有一个 Delphi XE5 Android 应用程序,它连接到在 PC 上运行的 Indy FTP 服务器(服务器是 Indy 10 IdFTPServer 演示)。 我通过 FTP 从服务器获取相同的文件(每 2 秒)并在我的 Android 设备上的标签中显示内容(24 个字符)。它总是工作 16 次,然后 android 应用程序退出。 从服务器的角度来看,它报告“10054, Connection reset by peer”

代码如下:

procedure TForm3.FetchTimerTimer(Sender: TObject);  
var  
    str : string;  
begin
    inc(FetchCnt);    
    aStream.Position := 0;  
    FTP.Get('Time1.txt', aStream);  
    aStream.Position := 0;  
    str := aStream.ReadString(255);  
    CmdLabel.text := inttostr(FetchCnt) + ') ' + str;  
end;  

16 是一个神奇的数字吗?在第 16 次 FTP.Get 之前按预期工作 想法?

【问题讨论】:

  • 经过进一步调查,Android 应用似乎在 17 日 FTP.Get 后出现分段错误。我可以删除除 FTP.Get 之外的所有内容,但它仍然失败。如果我注释掉 FTP.Get,并将 str 分配给'dummy',它会运行(永远)。任何人都需要想法????
  • 分段错误就像 Windows 上的访问冲突。但是如果不知道是哪个代码提高了 SF,就很难诊断。由于 TIdFTP 能够毫无问题地工作 16 次,而且每次都是同一个文件,这让我觉得可能是某些内存已损坏或导致崩溃。当错误发生时你能得到堆栈跟踪吗?如果你下载其他文件,它仍然会崩溃吗?
  • @RemyLebeau 空项目(完全没有代码),只有 IdFTP 组件拖放到表单上并在 4.3(HTC One)上运行,在应用程序退出时应用程序退出,并且在引发 android 错误之后“很遗憾,Project1 已经关闭。”这是一个已知的 IdFTP 错误,即使在 XE5 更新 2 中...?调试器在 IdStack.pas 中的 IdStack.DecUsage 处引发分段错误,如果我理解正确,这就是 Indy 关闭过程...?
  • @JustMarc:不,这不是已知的错误。 TIdStack.IncUsage() 在任何 Indy 组件被实例化时调用,然后在组件被释放时调用 TIdStack.DecUsage()。这些方法维护对 Indy 的 GIdStack 全局单例的活动引用,它提供了所有低级套接字 API 访问。如果DecUsage() 崩溃,这可能表明未正确管理单例的引用计数,因此可能正在对死对象调用DecUsage()
  • @JustMarc:这让我觉得 TComponent.FreeNotification() 系统在 ARC 下被破坏了。 TComponent 维护对其拥有的组件的活动引用。调用FTP.Free() 只是减少对象的引用计数,它实际上并没有释放对象,因为所有者仍然拥有对它的引用。所以实际的免费仍然会延迟到所有者(表单)在应用退出时被释放。如果要立即释放对象,请改用FTP.DisposeOf()。不过,我不排除 GIdStack 对象仍然存在 ARC/计时问题的可能性。

标签: android delphi ftp indy delphi-xe5


【解决方案1】:

TIdFTP 中没有任何内容来限制您可以通过同一连接执行的传输次数。您看到的错误意味着服务器端的连接丢失。可能demo只允许16个传输,我不知道(你提到的demo我不熟悉)。或者也许只有有限数量的可用端口。您是在主动模式还是被动模式下执行传输?我建议您在客户端和服务器之间放置一个数据包嗅探器,看看网络上实际发生了什么。

【讨论】:

  • 我用的是Active,试过Passive,但连接不成功。我会试试数据包嗅探器....
  • 客户端和服务器之间是否有代理/路由器?如果是路由器,被动模式将不起作用,除非您为路由器配置端口转发规则以将 FTP 连接传递到服务器 PC。
  • 我相信路由器,但我想我还是想使用主动模式。一切正常,直到第 17 次文件传输时 Android 客户端因分段错误而中止并断开连接。我从头开始(使用 Indy)创建了一个新的 FTP 服务器,而不是使用演示,它做同样的事情。问题似乎确实出在 Android 端的客户端,服务器将继续运行并正常运行,即使客户端在 17 日崩溃,并且可以重新运行并再做 17 次。
  • 我认为被动模式在移动设备上工作得更好,因为它是从设备到服务器的出站连接,而主动模式是从服务器到设备的入站连接。但如果它对你有用,那就这样吧。至于段错误,需要更多的调试才能知道实际上是什么代码在引发它,无论是在 Indy 中还是在 Android 本身中。
  • 感谢 Remy 的帮助,我想我还是把调试留给别人吧;因为它是 Delphi Android 生命的早期阶段。我切换到使用 IdTCP 服务器和客户端,并且管道已启动并正在运行。现在我可以继续申请了。再次感谢。后来,保罗
猜你喜欢
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
相关资源
最近更新 更多