阻塞和非阻塞

2022-06-07 17:30:12 字數 1367 閱讀 9248

在 windows 下的 socket 程式設計有兩個程式設計模型,阻塞和非阻塞。有時,他們也被叫做同步(阻 塞)和非同步(非阻塞)。

在 unix 中只支援阻塞模型。 

阻塞 indy 使用阻塞 socket 呼叫。阻塞呼叫很像乙個檔案的讀寫。當你讀資料或者寫資料時,直 到操作完成,函式才會返回。不同的是,socket 中,操作可能會消耗更久因為資料可能不能 立即讀寫。乙個讀或寫操作的速度無法超過網路或模型接收和傳輸資料的速度。

使用 indy 時,連線乙個介面只要簡單的呼叫 connect 方法,然後等待它返回。如果 connect 成功,它會在連線後返回。如果 connect 方法失敗,它會引發相應的異常 

非阻塞

非阻塞 socket 使用事件機制。呼叫被觸發後,當他們完成或者需要被注意時,引發事件。

比如,當嘗試連線乙個 socket 時,你必須呼叫 connect 方法。connect 方法在 socket 連線前 就立即會返回值。當 socket 連線上了,乙個事件會發生。這要求通訊邏輯被分成許多程式, 或者使用輪詢迴圈(polling loops)。

阻塞的優點

1. 易於程式設計 — 阻塞 socket 很易於程式設計。所有的使用者**都在乙個地方,並且順序排列。

2. 跨平台 — 由於 unix 使用阻塞 socket,可攜式**很好寫。indy 依靠這個事實來實現 它的單源**跨平台能力。其他跨平台的 socket 元件通過內部使用阻塞呼叫來模擬非 阻塞行為。

3. 多執行緒工作良好 — 由於阻塞 socket 的使用按照自然順序,他們是可繼承的封裝,因 此很適合多執行緒。

4. 不依賴訊息 — 非阻塞 socket 依賴於 window 資訊系統。當在多執行緒中使用時,分別的 資訊序列要被建立。當不在多執行緒中使用時,處理多鏈結時很容易發生瓶頸情況。

阻塞的缺點

客戶端使用者介面"凍結" — 阻塞 socket 呼叫後直到完成任務才會返回。當這呼叫發生在應用 的主線程中時,主線程無法處理使用者介面訊息。這導致使用者介面的"凍結"。凍結的發生是由 於直到阻塞 socket 呼叫返回控制應用程式的控制代碼前,更新,重繪和其他訊息都無法被處理。

非阻塞的優點

1. 客戶端無使用者介面"凍結" — 因為使用者**響應事件,windows 在 socket 事件間擁有 控制權。因此,windows 也可以答覆其他 windows 訊息。

2. 可以不用多執行緒的多工 — 單執行緒可以處理許多 socket。

3. 許多 socket 是輕量級的 — 因為許多 socket 可以被處理而不需要多執行緒,記憶體和 cpu 的占用通常很少。

非阻塞的缺點

程式設計更難 — 非阻塞要求使用輪詢或者事件。由於輪詢很沒效率,事件更常用。使用事件要 求使用者**分成許多子過程因此需要狀態追蹤。這導致**易於出 bug 並且難以維護。

阻塞和非阻塞

在 windows 下的 socket 程式設計有兩個程式設計模型,阻塞和非阻塞。有時,他們也被叫做同步 阻 塞 和非同步 非阻塞 在 unix 中只支援阻塞模型。阻塞 indy 使用阻塞 socket 呼叫。阻塞呼叫很像乙個檔案的讀寫。當你讀資料或者寫資料時,直 到操作完成,函式才會返回。不同的是...

recv send 阻塞和非阻塞

在 阻塞模式 下,send函式的過程是將應用程式請求傳送的資料拷貝到傳送快取中傳送就返回.但由於傳送快取的存在,表現為 如果傳送快取大小比請求傳送的大小要大,那麼send函式立即返回,同時向網路中傳送資料 否則,send會等待接收端對之前傳送資料的確認,以便騰出快取空間容納新的待傳送資料,再返回 接...

recv send 阻塞和非阻塞

int send socket s,const char far buf,int len,int flags 不論是客戶還是伺服器應用程式都用send函式來向tcp連線的另一端傳送資料。客戶程式一般用send函式向伺服器傳送請求,而伺服器則通常用send函式來向客戶程式傳送應答。該函式的第乙個引數指...