Socket套接字程式設計(I O模型)

2021-08-20 04:29:56 字數 1180 閱讀 3622

當上層應用呼叫recv系統呼叫時,如果對方沒有傳送資料(緩衝區沒有資料),上層應用將被linux核心阻塞(預設行為)。

當對方傳送了資料,linux核心套接字緩衝區有資料後,核心會把資料copy給使用者空間。然後上層應用解除阻塞,執行下一步操作。

非阻塞i/o

上層應用程式將套接字設定成非阻塞模式。輪詢呼叫recv函式來接收資料。若緩衝區沒有資料,上層應用程式不會阻塞,recv返回值為-1,錯誤碼是ewouldblock。

但在不斷輪詢的過程中,會造成上層應用程式忙等待,大量消耗cpu。應用範圍小,該模型一般與i/o復用配合使用

上層應用程式呼叫select機制,該機制有linux核心的支援,避免了忙等待,通過輪詢檔案描述符來觀察狀態的變化。當select管理的檔案描述符沒有資料或者狀態沒有變化時,上層應用程式也會阻塞。

好處:select機制可以管理多個檔案描述符,類似於程序池。將select看成乙個管理者,用其來管理多個i/o。 一旦檢測到的乙個i/o或多個io有事件發生,select函式將返回,返回值為檢測到的事件個數。進而利用select相關api函式,操作具體事件。同時select函式還可以設定等待時間,避免了上層應用程式長期僵死。與阻塞i/o模型相比,i/o復用模型相當於提前阻塞了。等到有資料到來時,再呼叫recv就不會發生阻塞。

上層應用程式建立sigio訊號處理程式。當緩衝區有資料到來,核心會傳送訊號告訴上層應用程式。當上層應用程式接收到訊號後,呼叫recv函式,因為緩衝區有資料,recv函式一般不會阻塞。

屬於典型的「拉模式」。即上層應用需要呼叫recv函式把資料拉進來。

上層應用程式呼叫aio_read函式,同時提交乙個應用層的緩衝區buf;呼叫完畢後,不會阻塞。上層應用程式可以繼續其他任務。當tcpip協議緩衝區有資料時,linux核心主動的把資料copy到使用者空間。然後再給上層應用傳送訊號。

屬於典型的「推模式」,是效率最高的一種,上層應用程式具有非同步處理的能力(處理其他任務的同時,也可支援i/o通訊)。

套接字i o模型

當套接字建立時,預設情況下是工作在阻塞模式。在阻塞模式下,執行i o的winsock呼叫 如send 和recv 一直到操作完成時才返回。比如呼叫recv 函式,如果對應的緩衝區沒有資料到來。呼叫者將會一直等待下去,直到有資料到達為止。1 阻塞 blocking 模型 對於以下函式呼叫 int ir...

套接字I O模型

在unix下可用的5種i o模型為 柱塞i o模型 非柱塞i o模型 i o復用 select和poll 訊號驅動式i o sigio 非同步i o 柱塞式i o模型 最流行的i o模型是柱塞式i o模型,預設情況下所有套接字都是用柱塞的,以資料報套接字為例子,如圖 程序呼叫recvfrom,其系統...

套接字Socket網路程式設計與io流

1.在專案跟目錄下存放乙個request 0101.txt 用來存放客戶端傳給伺服器的資訊 和乙個response 0101.txt 用來存放伺服器傳給的客戶端資訊 兩個文字文件 2.編寫客戶端程式 public class client 建立 乙個socket連線,並繫結ip和埠號 socket ...