【问题标题】:Is there a way to make sure an Indy 9 socket connection is truly broken (Delphi 6 application)?有没有办法确保 Indy 9 套接字连接真正断开(Delphi 6 应用程序)?
【发布时间】:2012-06-07 01:02:52
【问题描述】:

我有一个 Delphi 6 应用程序,它通过套接字与外部硬件设备交换音频数据。硬件设备内部存在问题,有时其内部缓冲区处理速度会变慢,尤其是在长时间使用期间,并且令人讨厌的延迟会蔓延到音频流中。这是一个重大问题,因为音频数据经常是人们之间双向实时对话的基础。但是,断开连接并重新建立连接可以解决问题。

我知道如何使用 Indy 关闭/断开套接字,这很容易。我担心如果我尝试重新连接太快,Indy 中的某些连接缓存机制或 Windows 套接字层本身可能会破坏我的断开连接工作。有没有办法确保与外部硬件设备的套接字连接真正断开?最好问一下,有没有办法确保我的重新连接尝试强制创建一个新的套接字(句柄?)而不是重新使用旧的套接字连接?

只有在创建全新连接时,外部硬件设备才会“重置”,这可能是因为它会刷新其内部队列并重新开始(我的猜测是因为我没有设备的源代码)。

【问题讨论】:

    标签: delphi sockets indy-9


    【解决方案1】:

    Indy 不会阻止您立即重新连接。 Windows 唯一会这样做的情况是,如果您每次都为客户端分配相同的本地端口以绑定到。在这种情况下,您必须等待 Windows 释放该端口以供重复使用。您可以手动设置套接字的延迟选项以禁用 Windows 的延迟并立即释放。或者不分配本地端口,每次(重新)连接时都会使用一个随机端口。

    【讨论】:

    • 我不担心重新连接的问题,我担心旧的套接字句柄/连接会在“我背后”被重新使用(或者可能从来没有真正被打破过),因此我尝试断开连接的外部硬件设备甚至不会看到断开连接事件。我想绝对确保外部设备看到连接中断,因此丢弃与先前连接关联的旧数据结构。这是我需要担心的事情吗?
    • 旧连接不会被重用。
    猜你喜欢
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    相关资源
    最近更新 更多