【发布时间】:2022-01-05 21:18:09
【问题描述】:
我想了解 Indy 套接字超时是如何工作的,因为我想通过以下方式使用它们。
我有一个通过 Internet 传输文件的应用程序(TCP 服务器/客户端)。当我开始传输时,如果我决定这样做,我希望能够足够快地停止传输(比如说,1500 毫秒)。如果某个套接字正在读取数据,并且线路上发生了一些事情使它迟到了,我将无法停止传输,因为套接字挂起读取数据。所以我需要设置一些短暂的超时,在正常操作中不会被触发。但是,如果发生某些事情并且数据运行延迟,则控制权将传递给主 proc,我将能够检查中止请求。
现在,我不知道接下来要做什么...如果套接字读取超时,那意味着什么?套接字在那段时间没有收到任何数据......或者,套接字在缓冲区中接收了一些数据但没有时间完成?我有一种感觉,这些超时是发生某事的等待期(开始读取或写入操作)。但是(假设是一次读取),一旦开始,如果套接字接收到一半的数据(他被要求读取)然后什么都没有会发生什么?该调用会永远阻止程序执行吗?因为如果发生这种情况,我将无法再次检查中止请求。
反正...当超时发生时,会引发异常吗?我可以抓住它然后再试一次,在同一个连接中,就像什么都没发生一样?超时后是否会修改输入/输出缓冲区?
我正在使用它来设置读写超时:
Socket.ReadTimeout:= WorkingRTimeOut;
Socket.Binding.SetSockOpt(SOL_SOCKET, SO_SNDTIMEO, WorkingWTimeOut);
【问题讨论】: