【问题标题】:Why do calls to IdUDPClient.SendBuffer not always return?为什么对 IdUDPClient.SendBuffer 的调用并不总是返回?
【发布时间】:2017-02-11 22:51:51
【问题描述】:

我需要每两秒重复发送 4 个字节 00 00 00 F6
但是,IdUDPClient.SendBuffer 传输后没有返回。

我尝试多发送几个字节,每次都返回。

这行得通:

UDP.SendBuffer(RawToBytes(#0 + #0 + #0 + #1 + #127 + #128 + #246, 7));

这不起作用:

UDP.SendBuffer(RawToBytes(#0 + #0 + #0 + #246, 4));

我尝试了许多在各种相关 StackExchange 问题中找到的建议,但均未成功。

我至少见过三种情况:

  1. 挂起,Wireshark 看到 1 个传输。
  2. 工作重复传输,但不是 4 字节数据。
  3. 有时字节 > 7F3F 发送。

谁能指出我做错了什么?

编辑:以上发生在一个线程中。如果将TIdUDPClient 作为可见组件放在表单上,​​那么它可以正常工作。

这可能是线程/重入问题???

【问题讨论】:

  • 请提供一个Minimal, Complete, and Verifiable example 来说明问题。另外,您在滥用RawToBytes()。使用Send() 而不是SendBuffer()。或使用IdGlobal.ToBytes()。或者手动构造一个TIdBytes 变量。
  • @Remy Lebeau 我制作了一个 MCV 给你看,它奏效了。谢谢你催我清理。应该是线程问题。回到绘图板。
  • @Remy Lebeau SetLength 的 TidBytes 变量很容易忘记 :-(

标签: delphi indy indy10 delphi-6


【解决方案1】:

查看更多代码肯定会有所帮助,您是否确保线程实际正在运行(调用 Execute),否则您的代码显然不会运行 :)

在可见表单上使用 TIdUDPClient 组件的区别在于它是自动创建的(构造函数由 delphi 设计器自动运行)

    TIdUDPClient.Create(AOwner: **)

通过这样做,组件将在主线程(“GUI 线程”,如果你愿意的话)上运行

我建议你做的几件事是:

首先确保线程正在执行

问题也可能是 TIdUDPClient 如果在线程内使用 TIdUDPClient.Create(nil) 实例化,则没有所有者,请尝试使用 TThread 或应用程序实例化 int 并拥有所有者

    TIdUDPClient.Create(Self)

    TIdUDPClient.Create(Application)

希望这会有所帮助,但正如我所说,发布更多您的代码肯定会让我有可能帮助您!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2013-07-03
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多