網路ipc:套接字
1.套接字描述符在unix系統上是使用檔案描述符實現的,許多處理檔案描述符的函式都可以處理套接字描述符
2.對於sock_stream套接字,應用程式意識不到報文界限,因為套接字提供的是位元組流服務。這就意味著從套接字讀出資料時,它也許不會返回所有由傳送程序所寫的位元組數。最終可以獲得傳送過來的所有資料,但也許要通過若干次函式呼叫得到
3.sock_seqpaket套接字是基於報文的服務而不是位元組流服務。從它接受的資料量與對方傳送的一致,基於流控制傳輸協議sctp
4.套接字描述符本質是檔案描述符,大多數使用檔案描述符的函式可以處理套接字描述符
5.套接字通訊是雙向的,shutdown來禁止套接字的輸入或輸出
6.close只有在最後乙個活動引用被關閉時才釋放網路節點。這意味著如果複製乙個套接字(例如dup),套接字直到關閉了最後乙個引用他的檔案描述符後才會被釋放。而shutdown允許使乙個套接字處於不活動的狀態,無論他的引用數目是多少
8.與客戶端的套接字關聯的位址沒有太大意義,可以讓系統選乙個預設位址。然而面對與伺服器,需要給乙個接受客戶端請求的套接字繫結乙個眾所周知的位址。客戶端應有一種方法來發現用以連線伺服器位址
9.埠號必須不小於1024,除非該程序具有相應的特權
10.對於網際網路域,如果指定ip位址為inaddr_any,套接字端點可以被繫結到所有的系統網路介面,意味著可以收到這個系統所安裝的所有網絡卡的資料報。如果呼叫connect或listen,但沒有繫結位址到乙個套接字,系統會選乙個位址並將其繫結到套接字
11.如果是處理的是面向連線的網路服務,在開始交換資料之前需要在客戶端套接字與伺服器套接字之間建立乙個連線
12.在connenct中所指定的位址是想與之通訊的伺服器的位址。如果sockfd沒有繫結到乙個位址,connect會給呼叫者繫結乙個預設位址
13.要連線的伺服器必須繫結到乙個想與之連線的位址,並且在伺服器的等待連線佇列中應有足夠的空間。
14.如果套接字描述符處於非阻塞模式下,那麼在連線不能馬上建立時,connect將會返回-1,並將errno設為特殊的錯誤碼,應用程式可以用poll或select來判斷檔案描述符何時可寫,如果可寫,連線完成
15.connect也可用於udp,這樣每次報文傳輸就不需要在提供位址
16.伺服器呼叫listen來宣告可以接受連線請求,引數backlog提供了乙個請求,用於表示該程序所要入隊的連線請求數量。其實際值由系統決定,一旦佇列滿,系統會拒絕多餘的連線請求,所以backlog的值應該基於伺服器期望負載和接受連線請求與啟動服務的處理能力來選擇
17.一旦伺服器呼叫了listen,套接字就能接收連線請求,使用函式accept獲得鏈結請求並建立連線
18.函式accept返回的檔案描述符是套接字描述符,該描述符連線到呼叫connect的客戶端。這個新的套接字描述符和原始套接字具有相同的套接字型別和位址族。傳給accept的原始套接字沒有關聯到這個鏈結,而是繼續保持可用狀態並接受其他的連線請求,如果不關心客戶端標識,可以將引數addr和len設為null,如果沒有連線請求等待處理,accept會阻塞直到乙個請求到來。如果sockfd處於非阻塞模式,accept會返回-1並將errno設定為eagin
19.如果伺服器呼叫accept並且當前沒有連線請求,伺服器會阻塞直到乙個請求到來。另外,伺服器可以使用poll,select來等待乙個請求的到來,這種情況下,乙個帶等待處理的連線請求套接字會以可讀的方式出現
20.send返回時,並不必然表示連線的另一端的程序接收資料。所保證的僅是當send成功返回時,資料已經無錯誤的傳送到網路上
21.send會阻塞直到整個資料被傳輸
22.sendto可以用來無連線的通訊,對於無連線的套接字不能使用send,除非在connect時預先設定了位址
23.還可以使用sendmsg進行傳輸資料
24.當使用msg_leek時,可以檢視一下要讀的資料但不會真正取走
25.容忍包丟失意味著兩個選擇。如果想和對方可靠通訊,必須對資料報編號,如果發現包丟失,則要求對方重新傳輸,如果出現重複將其丟棄。另一選擇是通過讓使用者再次嘗試命令來處理錯誤,面向連線更消耗系統資源
26.當伺服器終止並嘗試立即重啟時,函式不會正常工作所謂的埠復用,通常tcp不允許繫結同乙個位址,幸運的是套接字選項so_reuseaddr允許越過這個限制
27.tcp將帶外資料稱為緊急資料,tcp僅支援乙個位元組的緊急資料,但是允許緊急資料在資料流之外傳輸
28.通常recb函式沒有資料可用時會阻塞等待,同樣的當套接字輸出佇列沒有足夠空間來訊息時函式send會阻塞,在套接字非阻塞模式下,行為會改變。在這種模式下,這些函式不會阻塞而是失敗。當這下發生時可使用poll,select來判斷何時能再接受和傳輸資料
unix 環境高階程式設計 讀書筆記
unix環境高階程式設計 讀書筆記 第8章exit和 exit區別 exit會直接進入核心,不會關閉io流。程序基本控制函式還有 wait,fork,exec。atexit 程式正常退出時呼叫,如果因為signal退出則不能呼叫。功能 註冊函式可以完成一些清理工作,比如全域性log類,可以不設定析構...
unix環境高階程式設計 讀書筆記
檔案 unix支援在不同程序之間共享開啟的檔案。核心使用三種資料結構表示開啟的檔案 原子操作 一般而言,原子操作指的是由多步組成的操作。如果該操作原子的執行,要麼執行完所有步,要麼一步也不執行,不可能只執行所有步驟的乙個子集。2 注意 原子操作函式 pread,pwrite pread 相當於呼叫r...
讀書筆記之UNIX環境高階程式設計 11
執行緒 1.像每個程序有乙個程序id一樣,每個執行緒也有乙個執行緒id。程序id在整個系統中是唯一的,程序id相同,但執行緒id不同,執行緒id只在它所屬的程序環境有效 2.每個程序只有乙個控制線程即main執行緒 3.執行緒建立時並不能保證哪個執行緒會先執行 是新建立的執行緒還是呼叫執行緒 4.主...