套接字的預設狀態時阻塞的
可能阻塞的套接字呼叫可分為以下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 "view codeunp.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 }
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 程式語言 這兩本像字典一樣厚的書籍,剛開...