Linux 網路程式設計詳解九

2021-09-07 07:59:08 字數 1393 閱讀 9284

tcp/ip協議中sigpipe訊號產生原因

1.假設客戶端socket套接字close(),會給伺服器傳送位元組段fin;

2.伺服器接收到fin,但是沒有呼叫close(),因為socket有快取區,所以伺服器仍然可以向客戶端傳送資料。

3.如果這種狀態下伺服器向客戶端傳送資料,將會引起tcp/ip協議進行rst段重置,導致伺服器向當前程序傳送sigpipe訊號,

sigpipe訊號的預設動作是關閉當前程序。

sigpipe訊號產生的本質原因是管道的一端已經關閉,另一端卻繼續寫入資料。

所以在網路程式設計中必須要捕捉sigpipe訊號,因為不確定哪個端會突然close()。

close()函式詳解

close()函式關閉檔案讀寫兩個資料傳輸方向。

close()的本質是檔案引用計數原理,例如程序在fork()之前開啟乙個檔案描述符fd,那麼子程序的檔案描述符本質上是檔案表中描述符引用加一,

父程序中呼叫close(fd),檔案表中描述符引用減一,直到子程序同樣呼叫close(fd),檔案表中描述符引用為0,此時檔案才會真正關閉。

在tcp/ip協議中,假設在伺服器端,父程序負責accept()連線,子程序負責與客戶端通訊互動,如果乙個客戶端socket檔案描述符,

在父程序中沒有呼叫close()函式關閉socket檔案描述符,但是在子程序中呼叫close()函式關閉了socket檔案描述符,那麼子程序將無

法使用這個socket檔案描述符read()或者send()資料,但是這個socket檔案描述符仍然存在,因為父程序還引用著這個socket檔案描述

符,檔案表中的描述符引用不是0,因此伺服器端不會向客戶端傳送fin位元組段,客戶端就不會知道伺服器端實際上已經無法read和send資料,

導致客戶端可以傳送資料,卻接收不到資料,並且網路tcp/ip協議的狀態都是established狀態(已連線狀態)。所以多程序的伺服器端需

要在父程序中關閉客戶端socket檔案描述符。

shutdown()函式詳解

int shutdown(int sockfd, int

how);

功能:shutdown()函式也可以用來關閉檔案描述符,但是可以通過引數how來設定單獨的關閉檔案的讀或者寫

引數how

--shut_rd 關閉檔案讀資料傳輸

--shut_wr 關閉檔案寫資料傳輸

--shut_rdwr 關閉檔案讀寫資料傳輸

shutdown的技術原理和close()函式不同,shutdown()函式不**件表中檔案描述符被引用了多少次,只要呼叫一次shutdown()函式,就可以真正意義上將檔案關閉。

shutdown一般用法是關閉檔案單個的讀寫資料傳輸。

Linux 網路程式設計詳解十一

read timeout 讀超時檢測函式,不含讀操作 fd 檔案描述符 wait seconds 等待超時秒數,如果為0表示不檢測超時 成功返回0,失敗返回 1,超時返回 1並且errno etimedout int read timeout int fd,unsigned int wait sec...

Linux 網路程式設計詳解十二

udp的特點 無連線 基於訊息的資料傳輸服務 不可靠 udp更加高效 udp注意點 udp報文可能會丟失,重複 udp報文可能會亂序 udp缺乏流量控制 udp緩衝區寫滿之後,沒有流量控制,會覆蓋緩衝區 udp協議資料報文截斷 如果接收到的資料報文大於緩衝區,報文可以被截斷,後面部分丟失 recvf...

網路程式設計學習 九

ipv4的tcp客戶和乙個ipv6的tcp伺服器進行通訊的步驟如下 1.ipv6伺服器啟動後建立乙個ipv6的監聽套接字,我們假定伺服器把通配位址 到該套接字 2.ipv4客戶呼叫gethostbyname找到伺服器主機的乙個a記錄。伺服器主機既有乙個a記錄,又有乙個aaaa記錄,因為它同時支援ip...