I/O複用的場合:
1 客戶處理多個描述字時
2 客戶處理多個套接口
3 服務器處理監聽套接口,又要處理已鏈接套接口
4 既處理TCP,又處理UDP
5 處理多個服務或者多個協議
套接口上的輸入操做:
1 數據到達網絡,分組到達時,被拷貝到內核的某個緩衝區
2 將數據從內核緩衝區拷貝到應用緩衝區
非阻塞模型,應用進程接二連三的查詢內核,看看某操做是否準備好。這對CPU時間是極大的浪費。
I/O複用,調用select或pool,調用某一個阻塞
經過系統調用sigaction安裝信號處理程序,當數據準備好時,就生成一個SIGIO信號,調用recvfrom讀取數據報
異步IO模型:
調用函數aio_read傳遞給內核相關信息,內核數據拷貝完成後,返回信號
select()函數:
容許進程指示內核等待多個事件中的任一個發生,並僅在一個或多個時間發生或通過某指定的事件後才喚醒進程。
套接口準備讀:
1 接收緩衝區中的數據字節數大於等於套接口接收緩衝區低潮限度的當前值
2 鏈接的讀這一半關閉
3 套接口是一個監聽套接口且已完成的鏈接數爲非0
4 有一個套接口錯誤待處理
套接口準備寫:
1 發送緩衝區中的可用字節數大於等於套接口發送緩衝區低潮限度的當前值,且或 套接口已鏈接,套接口不要求鏈接
2 鏈接的寫這一半關閉
3 有一個套接口錯誤待處理
接收和發送低潮限度的目的:
在select返回以前,應用進程知道有多少出具可讀或有多大的空間可用於寫
使用shutdown相對於cloose的好處:
1 close將描述字的計數減1,在此計數爲0時才關閉套接口。用shutdown激發TCP正常鏈接終止序列,無論訪問計數
2 close終止了數據傳送兩個方向:讀和寫。
使用shutdown半關閉鏈接:
int shutdown(int sockfd,int howto);
howto類型:
1 SHUT_RD 關閉鏈接讀的這一半,再也不接受數據,現有的都做廢。
2 SHUT_WR 關閉鏈接的寫的這一半,當前緩衝區的數據都被髮送,後跟正常的TCP終止序列。
3 SHUT_RDWR 鏈接的讀這一半,和寫這一半都關閉。至關於兩次shutdown
拒絕服務型攻擊:
當一個服務器整處理多個客戶時,服務器不能阻塞於單個客戶相關的函數調用。若是這樣,服務器將懸掛並拒絕爲全部其餘的客戶提供服務。