在實現網路通訊前, 先來了解一下socket
套接字什麼時候就緒(可讀可寫). 第一次學習socket
只需要明白我用紅色標記的條件就行.
每個套接字接收區快取 (用於讀) 和傳送區快取 (用於寫) :
每個套接字都有接收快取區低水位標記(用於讀)和傳送快取區低水位標記(用於寫):
可以修改接收緩衝區的低水位來保證不用頻繁的呼叫讀, 等累計到一定的量在一次性讀. 這樣就可以減少讀的次數. 像libevent
就設定了使用者的低水位, 高水位.
監聽socket上有新的連線請求. 因為套接字收到了對方的connect請求, 執行了三次握手的第一步: 對方傳送syn請求過來, 使該方監聽套接字處於可讀狀態; 通常情況下, 對這樣的套接字執行accept操作不會阻塞.
已連線socket. socket核心接收快取區中的位元組數大於或等於其低水位標記so_rcvlowat
, 此時可以無阻塞地讀該socket, 並且讀操作返回的位元組數大於0.對於tcp和udp套接字而言, 其預設值為1, 預設情況下, 只要緩衝區中有資料, 那就是可讀的.
socket通訊對端關閉連線
[1], 此時對該socket讀操作將返回0.
socket上有未處理的錯誤
[2]. 對這樣的套接字的讀操作將不會阻塞並返回-1(即返回乙個錯誤), 同時把errno設定成確切的錯誤條件. 此時我們可以使用getsockopt
來讀取和清除該錯誤.select能處理的異常情況只有一種: socket上接收到帶外資料
已連線socket. socket核心傳送緩衝區中的可用位元組數大於或等於其低水位標記so_sndlowat
. 此時我們可以無阻塞寫該socket, 並且寫操作返回的位元組數大於0. 對於tcp和udp套接字而言, 低水位預設值為2048, 傳送緩衝區預設大小為8k.預設情況下, 乙個套接字連線成功後,總是可寫的.
socket寫操作被關閉. 對寫操作被關閉的socket執行寫操作將觸發乙個sigpipe
訊號, 該訊號的預設行為是終止程序.
socket使用非阻塞connect連線成功或者失敗(超時)
[3].使用非阻塞式connect的套接字已建立連線, 或者connect已經以失敗告終, 即connect已經完成.
socket上有未處理的錯誤
[2]. 對這樣的套接字的寫操作將不會阻塞並且返回-1(即返回乙個錯誤), 同時把errno設定成確切的錯誤條件. 此時我們可以使用getsockopt
來讀取和清除該錯誤.select能處理的異常情況只有一種: socket上接收到帶外資料.
注意 : 當socket錯誤時, 此時既可讀也可寫.
Python基礎 40 Socket 案例二
服務端 依舊為傳送1 30之間隨機的30個數字,以及將客戶端返回的結果展示出來 客戶端 1 第乙個client計算奇偶性,將結果返回 2 第二個client計算數字的2倍,將結果返回 3 第三個client判斷數字是否大於10,將結果返回 server端 coding utf 8 import so...
socket 描述符就緒條件
附註 我們一直在討論等待某個描述符準備好i o 讀或寫 或等待其上發生乙個待處理的異常條件 帶外資料 對於普通檔案的描述符,讀 寫和異常條件總是返回準備好 apue p407 而對於套接字就緒狀態的判斷如下 一 滿足下列四個條件中的任何乙個時,乙個套接字準備好讀。監聽socket 該套接字是乙個監聽...
NIO操作型別與就緒條件
使用nio程式設計時,對nio就緒選擇的理解,是nio程式設計的關鍵。nio與傳統io的區別是提供了就緒選擇的能力,為原來的阻塞的io提供了非阻塞的能力,從而為我們提供了用少量的執行緒數量同時為大量的連線通訊的可能。1 操作型別 nio的就緒選擇共涉及4個操作 op read,op write,op...