我想了解 Indy 套接字超時是如何作業的,因為我想按以下方式使用它們。
我有一個通過 Internet 傳輸檔案的應用程式(TCP 服務器/客戶端)。當我開始傳輸時,如果我決定,我希望能夠足夠快地停止它(比如 1500 毫秒)。如果某個套接字正在讀取資料,并且線路上發生了某些事情使其延遲,我將無法停止傳輸,因為套接字已掛起讀取資料。所以我需要設定一些短超時,在正常操作中不會被觸發。但是如果發生某些事情并且資料運行遲到,控制將被傳遞給主行程,我將能夠檢查中止請求。
現在,我不知道下一步該做什么……如果套接字讀取超時,那意味著什么?套接字在那段時間內沒有收到任何資料......或者,套接字在緩沖區中收到了一些資料但沒有時間完成?我有一種感覺,這些超時是等待發生某些事情的時間(開始讀取或寫入操作)。但是(比方說讀取),一旦開始,如果套接字接收到一半的資料(他被要求讀取)然后什么都沒有,會發生什么?該呼叫會永遠阻止程式執行嗎?因為如果發生這種情況,我將再次無法檢查中止請求。
反正...當超時發生時,它會引發例外?我可以抓住它并在同一個連接中再試一次,就像什么也沒發生一樣?超時后會修改輸入/輸出緩沖區嗎?
我正在使用它來設定讀取和寫入超時:
Socket.ReadTimeout:= WorkingRTimeOut;
Socket.Binding.SetSockOpt(SOL_SOCKET, SO_SNDTIMEO, WorkingWTimeOut);
uj5u.com熱心網友回復:
套接字超時按位元組應用。
如果您要求套接字讀取 N 個位元組,它將從套接字的接收緩沖區回傳盡可能多的位元組,最多 N 個位元組。它可以(并且經常這樣做)回傳更少的位元組,需要再次讀取以接收剩余的位元組。如果發生超時錯誤,則意味著對于當前讀取根本沒有及時到達位元組。沒有辦法知道為什么,或者他們是否會到達。
如果您要求套接字發送 N 個位元組,它將接受盡可能多的位元組,最多 N 個位元組,進入套接字的寫入緩沖區。它可以(有時確實)緩沖更少的位元組,需要另一個發送來緩沖剩余的位元組。如果發生超時,則意味著套接字的寫入緩沖區已滿,接收方的讀取速度不夠快(或根本沒有)及時清除發送方寫入緩沖區中的空間。
如果您要求 Indy 讀取/發送 N 個位元組,它可能會在內部執行多個套接字讀取/發送,等待所有預期的位元組被接收/發送。因此,在超時發生之前,它可能已讀取/發送 X 個位元組,其中 X < N。當然,您可以再次嘗試讀取/發送,只要求您尚未接收/發送的剩余位元組(N - X),但不要要求您已經接收/發送的位元組(X)。您可能會接收/發送更多位元組,或者您可能會再次超時,除非您嘗試,否則無法知道。但是,根據背景關系,可能不容易/不可能知道在超時之前接收/發送了多少位元組,因此您可能不知道要再次請求多少剩余位元組。在這種情況下,您可以明智地做的就是關閉 TCP 連接,重新連接,然后恢復/重新開始。
至于快速中止連接的能力,您可以將讀取/發送代碼移動到作業執行緒,然后Disconnect()在需要時將套接字從主 proc 移出。這通常會中止正在進行的任何阻塞讀取/發送。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/369763.html
上一篇:TIB_Script運行大腳本
