當套接字建立時,預設情況下是工作在阻塞模式。在阻塞模式下,執行i/o的winsock呼叫(如send()和recv())一直到操作完成時才返回。 比如呼叫recv()函式,如果對應的緩衝區沒有資料到來。呼叫者將會一直等待下去,直到有資料到達為止。
1>阻塞(blocking)模型
對於以下函式呼叫:
int iresult = recv(s, buffer,1024);
這是用來接收資料的,在預設的阻塞模式下的套接字裡,recv會阻塞在那裡,直到套接字連線上有資料可讀,把資料讀到buffer裡後recv函式才會返 回,不然就會一直阻塞在那裡。
在單執行緒的程式裡出現這種情況會導致主線程(單執行緒程式裡只有乙個預設的主線程)被阻塞,這樣整個程式被鎖死在這裡,如果永 遠沒資料傳送過來,那麼程式就會被永遠鎖死。這個問題可以用多執行緒解決。
2>select模型
一般如果如果對某個套接字進行收取,如果沒有資料,對阻塞模式而言,就會阻塞到有資料為止。
對 於select模式,就先查詢緩衝區是否有資料,如果有再收,這樣就不會阻塞了。select就是這個原理,傳入乙個套接字集合作為引數,select函 數檢查套接字的緩衝區,返回滿足條件的套接字集合,然後你對每乙個滿足條件的套接字呼叫收取函式,就能無阻塞的收取資料了。
比如下面**:
//初始化乙個套接字集合fdsocket,新增套接字控制代碼到這個集合
fd_set fdsocket; //所有可用套接字集合
fd_zero(&fdsocket);
fd_set(slisten,&fdsocket);
while (1)
else
}else
else}}
}}else
} ..........
套接字I O模型
在unix下可用的5種i o模型為 柱塞i o模型 非柱塞i o模型 i o復用 select和poll 訊號驅動式i o sigio 非同步i o 柱塞式i o模型 最流行的i o模型是柱塞式i o模型,預設情況下所有套接字都是用柱塞的,以資料報套接字為例子,如圖 程序呼叫recvfrom,其系統...
Windows套接字I O模型
兩中模式執行i o操作 阻塞模式 執行i o的winsock呼叫 如send和recv 一直到操作完成才返回。非阻塞模式 winsock函式會立即返回 1.select 選擇 模型 1 增加乙個套接字集合fd 2 設定乙個可讀或者可寫的套接字集合fd1 3 使用select函式 可設定等待的時長 獲...
套接字之重疊I O模型
剛剛把重疊i o套接字理解了一點,於是在此做個筆記,給出乙個重疊i o處理單個套接字的程式。這個程式是tcp的伺服器端程式。該程式只能接收乙個客戶端的連線,迴圈傳送資訊,以及該客戶端退出時伺服器端得到響應。套接字型檔初始化等 省略了,只包含乙個監聽部分和乙個處理i o部分的 如下 開始進行重疊i o...