深入 CSocket 編程之阻塞和非阻塞模式

發表于:2008-10-13來源:作者:點擊數: 標簽:阻塞CSocket模式
有時,花上幾個小時閱讀、調試、跟蹤優秀的源碼程序,能夠更快地掌握某些技術關鍵點和精髓。當然,前提是對這些技術大致上有一個了解。 我通過幾個采用 CSocket 類編寫并基于 Client/Server (客戶端 / 服務端)的網絡聊天和傳輸文件的程序 ( 詳見: 源代碼
有時,花上幾個小時閱讀、調試、跟蹤優秀的源碼程序,能夠更快地掌握某些技術關鍵點和精髓。當然,前提是對這些技術大致上有一個了解。

  我通過幾個采用 CSocket 類編寫并基于 Client/Server (客戶端 / 服務端)的網絡聊天和傳輸文件的程序 ( 詳見: 源代碼參考 ) ,在調試這些程序的過程中,追蹤深入至 CSocket 類核心源碼 Sockcore.cpp , 對于CSocket 類的運行機制可謂是一覽無遺,并且對于阻塞和非阻塞方式下的 socket 程序的編寫也是稍有體會。

閱讀本文請先注意:

  這里的阻塞和非阻塞的概念僅適用于 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

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97