【问题标题】:Understanding Indy Socket timeouts了解 Indy Socket 超时
【发布时间】:2022-01-05 21:18:09
【问题描述】:

我想了解 Indy 套接字超时是如何工作的,因为我想通过以下方式使用它们。

我有一个通过 Internet 传输文件的应用程序(TCP 服务器/客户端)。当我开始传输时,如果我决定这样做,我希望能够足够快地停止传输(比如说,1500 毫秒)。如果某个套接字正在读取数据,并且线路上发生了一些事情使它迟到了,我将无法停止传输,因为套接字挂起读取数据。所以我需要设置一些短暂的超时,在正常操作中不会被触发。但是,如果发生某些事情并且数据运行延迟,则控制权将传递给主 proc,我将能够检查中止请求。

现在,我不知道接下来要做什么...如果套接字读取超时,那意味着什么?套接字在那段时间没有收到任何数据......或者,套接字在缓冲区中接收了一些数据但没有时间完成?我有一种感觉,这些超时是发生某事的等待期(开始读取或写入操作)。但是(假设是一次读取),一旦开始,如果套接字接收到一半的数据(他被要求读取)然后什么都没有会发生什么?该调用会永远阻止程序执行吗?因为如果发生这种情况,我将无法再次检查中止请求。

反正...当超时发生时,会引发异常吗?我可以抓住它然后再试一次,在同一个连接中,就像什么都没发生一样?超时后是否会修改输入/输出缓冲区?

我正在使用它来设置读写超时:

Socket.ReadTimeout:= WorkingRTimeOut;
Socket.Binding.SetSockOpt(SOL_SOCKET, SO_SNDTIMEO, WorkingWTimeOut);

【问题讨论】:

    标签: sockets delphi indy


    【解决方案1】:

    套接字超时按字节应用。

    如果您要求套接字读取 N 个字节,它将从套接字的接收缓冲区返回尽可能多的字节,最多 N 个字节。它可以(并且经常确实)返回更少的字节,需要另一个读取来接收剩余的字节。如果发生超时错误,则意味着没有字节及时到达当前读取。没有办法知道为什么,或者他们是否会到达。

    如果你要求一个套接字发送 N 个字节,它会接受尽可能多的字节,最多 N 个字节到套接字的写缓冲区。它可以(有时确实)缓冲更少的字节,需要另一个发送来缓冲剩余的字节。如果发生超时,则意味着套接字的写入缓冲区已满,接收方读取速度不够快(或根本没有)以及时清除发送方写入缓冲区中的空间。

    如果您要求 Indy 读取/发送 N 个字节,它可能会在内部执行多个套接字读取/发送,等待所有预期的字节被接收/发送。因此,在超时发生之前,它可能已经读取/发送了 X 个字节,其中 X

    至于您快速中止连接的能力,您可以将读取/发送代码移动到工作线程,然后在需要时从主进程中 Disconnect() 套接字。这通常会中止任何正在进行的阻塞读取/发送。

    【讨论】:

    • 但是,当发生超时时,我可以确定即使在 Indy 操作中也没有发送或接收任何字节?
    • @MarusNebunu 不,可能已经发送/接收了一些字节。我在回答中说了这么多。仔细阅读第三段
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 2011-03-12
    • 2021-02-21
    • 2019-07-12
    相关资源
    最近更新 更多