閱讀本文請先注意:
這里的阻塞和非阻塞的概念僅適用于 Server 端 socket 程序。socket 意為套接字,它與 Socket 不同,請注意首字母的大小寫。
客戶端與服務端的通信簡單來講:服務端 socket 負責監聽,應答,接收和發送消息,而客戶端 socket 只是連接,應答,接收,發送消息。此外,如果你對于采用 CSocket 類編寫 Client/Server 網絡程序的原理不是很了解,請先查詢一下( 詳見:參考書籍和在線幫助 )。
在此之前,有必要先講述一下: 網絡傳輸服務提供者, ws2_32.dll , socket 事件 和 socket window 。
1、網絡傳輸服務提供者(網絡傳輸服務進程), Socket 事件, Socket Window
網絡傳輸服務提供者 ( transport service provider )是以 DLL 的形式存在的,在 windows 操作系統啟動時由服務進程 svchost.exe 加載。當 socket 被創建時,調用 API 函數 Socket (在 ws2_32.dll 中), Socket 函數會傳遞三個參數 : 地址族,套接字類型 ( 注 2 ) 和協議,這三個參數決定了是由哪一個類型的 網絡傳輸服務提供者 來啟動網絡傳輸服務功能。所有的網絡通信正是由網絡傳輸服務提供者完成 , 這里將 網絡傳輸服務提供者 稱為 網絡傳輸服務進程 更有助于理解,因為前文已提到 網絡傳輸服務提供者 是由 svchost.exe 服務進程所加載的。
下圖描述了網絡應用程序、 CSocket ( WSock32.dll )、 Socket API(ws2_32.dll) 和 網絡傳輸服務進程 之間的接口層次關系:
當 Client 端 socket 與 Server 端 socket 相互通信時,兩端均會觸發 socket 事件。這里僅簡要說明兩個 socket 事件:
FD_CONNECT: 連接事件 , 通常 Client 端 socket 調用 socket API 函數 Connect 時所觸發,這個事件發生在 Client 端。
FD_ACCEPT :正在引入的連接事件,通常 Server 端 socket 正在接收來自 Client 端 socket 連接時觸發,這個事件發生在 Server 端。
網絡傳輸服務進程 將 socket 事件 保存至 socket 的事件隊列中。此外, 網絡傳輸服務進程 還會向 socket window 發送消息 WM_SOCKET_NOTIFY , 通知有 socket 事件 產生,見下文對 socket window 的詳細說明。
原文轉自:http://www.anti-gravitydesign.com