介紹WinSock中“阻塞”與“非阻塞”的概念。

來源:互聯網
上載者:User
在Windows環境下,一般採用“非阻塞”方式。對於用戶端Socket來說,如果把Cli
entType特性設為ctNonBlocking,表示採用非阻塞方式進行串連。當位於另一端的服務
器端Socket試圖進行讀或寫時,用戶端Socket就會得到通知(OnRead事件或OnWrite事件
)。
    對於伺服器端Socket來說,如果把ServerType特性設為stNonBlocking,表示採用非
阻塞方式進行串連。當位於另一端的用戶端Socket試圖進行讀或寫時,伺服器端Socket
就會得到通知(OnClientRead事件或OnClientWrite事件)。在響應這些事件的控制代碼中都有
一個Socket參數,這個參數很有用,它就是伺服器端或用戶端的Socket對象(TClientWi
nSocket或TServerWinSocket或TServerClientWinSocket),這些Socket對象的共同基類
是TCustomWinSocket,TCustomWinSocket提供了在Internet上傳輸資料的方法,例如,
要讀取資料,可以調用ReceiveBuf或ReceiveText,要發送資料,可以調用SendBuf、Se
ndStream、SendText或SendStreamThenDrop,其中,SendStreamThenDrop能夠在發送完
資料後自動斷開Socket的串連。SendStream和SendStreamThenDrop適合於發送流對象,
例如檔案,不過,您並不需要顯式地刪除流對象,因為當Socket之間的串連斷開時,So
cket會自動釋放所有的流對象。
    與“非阻塞”方式不同的是,在“阻塞”方式下沒有諸如OnRead或OnWrite等非同步事
件,Socket必須主動去讀或寫資料,在讀或寫操作完成之前,應用程式處於等待狀態,
這樣就不可避免地會影響整個應用程式的效能。
    對於用戶端Socket來說,如果把ClientType特性設為ctBlocking,表示採用阻塞方
式進行串連。為了儘可能地減少“阻塞”方式的副作用,您可以把所有涉及到讀寫的操
作放在一個單獨的線程中,這樣,在32位的Windows環境下其它線程能夠繼續得到執行。
當然,如果在讀寫函數中客戶程式本身沒有其它事情要做,您就不必建立一個線程了。

    對於伺服器端Socket來說,如果把ServerType特性設為stThreadBlocking,表示采
用阻塞方式進行串連,C++ Builder 3為每一個阻塞方式的串連自動分配一個新的線程,
這樣,即使有某個客戶進行中讀寫操作,其它客戶也不必等待。伺服器端的Socket用
TServerClientThread對象來操縱每一個線程,當線程開始執行時,它就檢查位於另一端
的客戶是否正在試圖進行寫,如是,就觸發OnClientRead事件,如果檢查出客戶不在試
圖寫,它就觸發OnClientWrite事件讓伺服器去寫。
    實際上,這種用線程對象來管理串連的方式可以認為是“假阻塞”方式,就編程而
言,與“非阻塞”方式是相似的。比較麻煩的是用戶端,它怎麼知道對方(指伺服器端)
已準備好讀或寫呢?這就要用到TWinSocketStream對象,調用這個對象的WaitForData可
以保證伺服器和客戶的同步。用TWinSocketStream對象進行讀或寫時,如果在20秒內操
作還沒有完成,TWinSocketStream對象就認為逾時了,它就會自動中斷連線,這樣就能
避免應用程式鎖死。正是由於TWinSocketStream對象具有逾時保護機制,您也可以把TW
inSocketStream對象用於伺服器端進行讀或寫。要注意的是,TWinSocketStream對象不
能用於“非阻塞”方式。
    也許有的讀者要問,既然阻塞方式可能會影響應用程式的效能,雖然用多線程技術
可以加以彌補,但又使編程變得複雜,為什麼還要用“阻塞”方式呢?這是因為,在阻
塞方式下,讀或寫是主動的,您可以在讀或寫操作完成後安全地關閉Socket的串連。而
在“非阻塞”方式下,讀或寫是隨機的,Socket必須經常保持在串連狀態才能捕捉到異
步事件。來源於網路!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.