Winsock編程_第3篇_套接字阻塞模式1

         最近受一位編程牛人的影響,本身決定從今天開始將Windows Sockets 網絡編程的內容以日誌的形式記錄下來,其一是爲本身保留一份筆記,其二是加深本身對winsock編程的理解,其三是和喜歡代碼的朋友一塊兒分享編程的樂趣,我不知道本身能不能一直堅持下去,可是我會盡本身最大的努力作到每週更新1-2篇,在此也但願更多的朋友爲我提出建議,若是你也喜歡編程,在閱讀代碼的過程當中有什麼疑問,請與本人進行探討。
 
        每次我會以一段程序代碼的分析來闡述其中的知識點,由於閱讀大量優秀代碼能夠快速提高自身的編程水平。
套接字阻塞模式開發:

        套接字的阻塞模式是指套接字在執行操做是,調用函數在沒有完成操做以前不會當即返回的工做模式。阻塞模式的套接字用於少許數據的發送與接收到簡單的網絡程序的開發。

       在阻塞模式的套接字上,調用任何一個Windows Sockets API都會消耗不肯定的等待時間。在調用recv()函數時,發生在內核中等待數據和複製數據的過程如圖所示: 編程

當調用recv()函數時,系統會首先檢查是否有準備好的數據。若是數據沒有準備好,系統就處於等待狀態。當數據準備好後,將數據從系統緩衝區複製到用戶空間,而後該函數返回。在套接字應用程序中,當調用recv()函數時,用戶空間未必就已經存在數據,此時recv()函數就會處於等待狀態。 

        並非全部Windows Sockets API以阻塞套接字爲參數調用都會發生阻塞。例如,以阻塞模式的套接字爲參數調用bind()、listen()函數時,函數會當即返回。將可能阻塞套接字的Windows Sockets API調用分爲如下四種:
1.輸入操做
recv()、recvfrom()、WSARecv()和WSARecvfrom()函數。以阻塞套接字爲參數調用該函數接收數據。若是此時套接字緩衝區內沒有數據可讀,則調用線程在數據到來前一直睡眠。
2.輸出操做
send()、sendto()、WSASend()和WSASendto()函數。以阻塞套接字爲參數調用該函數發送數據。若是套接字緩衝區沒有可用空間,線程會一直睡眠,直到有空間。
3.接受鏈接
accept()和WSAAcept()函數。以阻塞套接字爲參數調用該函數,等待接受對方的鏈接請求。若是此時沒有鏈接請求,線程就會進入睡眠狀態。
4.外出鏈接
connect()和WSAConnect()函數。對於TCP鏈接,客戶端以阻塞套接字爲參數,調用該函數向服務器發起鏈接。該函數在收到服務器的應答前,不會返回。這意味着TCP鏈接總會等待至少到服務器的一次往返時間。
 
使用阻塞模式的套接字,開發網絡程序比較簡單,容易實現。當但願可以當即發送和接收數據,且處理的套接字數量比較少的狀況下,使用阻塞模式來開發網絡程序比較合適。
 
阻塞模式套接字的不足表現爲,在大量創建好的套接字線程之間進行通訊時比較困難。當使用「生產者-消費者」模型開發網絡程序時,爲每一個套接字都分別分配一個讀線程、一個處理數據線程和一個用於同步的事件,那麼這樣無疑加大系統的開銷。其最大的缺點是當但願同時處理大量套接字時,將無從下手,其擴展性不好。  服務器

轉載請註明出處,謝謝!
原文地址:http://http://www.foregoer.com
相關文章
相關標籤/搜索