UNP學習筆記(第十六章 非阻塞I O)

2021-07-04 13:01:29 字數 1417 閱讀 9637

套接字的預設狀態時阻塞的

可能阻塞的套接字呼叫可分為以下4類:

1.輸入操作,包括read、readv、recv、recvfrom和recvmsg。

2.輸入操作,包括write、writev、send、sendto和sendmsg。

3.接受外來連線,即accept函式。

4.發起外出連線,即用於tcp的connect函式(該函式一直要等到客戶收到對於自己的syn的ack為止才返回)

非阻塞connect

當在乙個非阻塞的tcp套接字上呼叫connect時,connect將立即返回乙個einprogress錯誤,不過已經發起的tcp三路握手繼續執行。

非阻塞的connect有三個用途:

1.完成乙個connect至少要花乙個rtt時間,這段時間內也許我們想要執行的其他處理工作可執行

2.我們可以使用這個技術同時建立多個連線。這個用途已隨著web瀏覽器變得流行起來

3.既然使用select等待連線的建立,我們可以給select指定乙個時間限制,使得我們能夠縮短connect的超時

應用程式有時想要乙個更短的超時時間,實現方法之一是使用非阻塞connect

非阻塞connect:時間獲取客戶程式

下面給出connect_nonb函式執行乙個非阻塞connect,其中第四個引數是等待連線完成的秒數

1 #include    "

unp.h"2

3int

4 connect_nonb(int sockfd, const sa *saptr, socklen_t salen, int

nsec)536

37if (fd_isset(sockfd, &rset) || fd_isset(sockfd, &wset)) else

42 err_quit("

select error: sockfd not set");

4344

done:

45 fcntl(sockfd, f_setfl, flags); /*

restore file status flags

*/46

47if

(error)

52return(0

);53 }

view code

select之後,如果描述符變為可讀或可寫,我們就呼叫getsockopt取得套接字的待處理錯誤。如果連線成功,該值將為0。

非阻塞connect:web客戶程式

在web客戶程式中。客戶先建立乙個與某個web伺服器的http連線,再獲取乙個主頁,該主頁往往含有多個對於其他網頁的引用。

客戶可以使用非阻塞connect同時獲取多個網頁,以此取代每次只獲取乙個網頁的序列獲取手段。

UNP UNIX網路程式設計 第十六章 非阻塞式I O

套接字預設狀態是阻塞的。也就是說當發出乙個不能立即完成的套接字呼叫時,程序將被投入睡眠,等待相應操作的完成 一般分為四類 1.輸入操作 包括read readv recv recvfrom recvmsg這5個函式。當套接字緩衝區沒資料可讀時,程序將被投入睡眠狀態,直到有資料可達。2.輸出操作 包括...

C Primer Plus 第十六章筆記

一 string類 1.建構函式 注 npos為字串的最大長度 nbts表示以空字元結尾的字串 2.輸入 3.使用字串 1 可以運用關係運算子比較字串。2 size 和length 成員函式返回字串的字元數。3 搜尋字串或字元 4 capacity 返回當前分配給字串的記憶體塊的大小 reverse...

學習C 的後續方法 第十六章心得

accelerate c 這本書其實很久之前就已購入手中了 由於此書已經絕版了,網上被炒到了幾百 但是由於某些原因,一直沒能拜讀 傳說中的最佳c 入門書籍 說來也是慚愧。一說起c 的入門書籍,大家也許都會想到 c primer c primer plus c 程式語言 這兩本像字典一樣厚的書籍,剛開...