啟動我們的客戶/伺服器程式對,然後kill掉伺服器子程序。看看客戶端發生了什麼?
伺服器端檢視結果:
zhaoxj$ netstat -antdp
(並非所有程序都能被檢測到,所有非本使用者的程序資訊將不會顯示,如果想看到所有資訊,則必須切換到 root 使用者)啟用internet連線 (伺服器和已建立連線的)
proto recv-q send-q local address foreign address state pid/program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* listen -
tcp 0 0 0.0.0.0:9877 0.0.0.0:* listen 15578/tcpserv03
tcp 0 0 127.0.0.1:631 0.0.0.0:* listen -
tcp 0 0 127.0.0.1:9877 127.0.0.1:35377 established 15613/tcpserv03
tcp 0 0 127.0.0.1:35377 127.0.0.1:9877 established 15612/tcpcli01
客戶端(再開啟乙個終端):
zhaoxj$ ./tcpcli01 127.0.0.1
hello
hello
伺服器端:
zhaoxj$ kill -9 15613 在這裡kill掉伺服器的子程序
zhaoxj$ child 15613 terminated
客戶端:
zhaoxj$ ./tcpcli01 127.0.0.1
hello
hello
another line kill掉子程序後 鍵入此行 回車
str_cli: server terminated prematurely
具體過程如下:
1.kill掉子程序後,子程序中所有開啟的描述字全部關閉,並向客戶端傳送乙個fin。而客戶端tcp則響應乙個ack。
2.sigchld訊號被傳送給伺服器端的父程序
3.當我們鍵入"another line"時,str_cli呼叫writen,客戶端tcp接著把資料傳送給伺服器。
tcp允許這麼做,因為客戶tcp接收到fin只是表示伺服器程序已關閉了伺服器端的連線,伺服器端不再傳送任何資料。fin的接收並沒有告知客戶端tcp伺服器程序已經終止。
4.當伺服器端tcp接收到來自客戶端的資料時,先前開啟的那個套介面的程序已經終止,於是響應乙個rst。
5.然而客戶程序看不到這個rst,因為它在呼叫wrien後立即呼叫readline,並且由於接收到的fin,所呼叫的readline立即返回0.
6.當客戶終止端時,它所有開啟的描述字全部關閉
本例子的問題在於:當fin到達客戶端套介面時,客戶正阻塞在fgets呼叫上。客戶端實際上在對應兩個描述字----套介面和終端輸入,客戶端不能單純阻塞在這兩個描述字中某個特定的輸入上,而是應該阻塞在其中任何乙個描述字的上。這正是select和poll這兩個函式的目的之一。
套介面程式設計理論基礎 伺服器程序終止
啟動我們的客戶 伺服器程式對,然後kill掉伺服器子程序。看看客戶端發生了什麼?伺服器端檢視結果 zhaoxj netstat antdp 並非所有程序都能被檢測到,所有非本使用者的程序資訊將不會顯示,如果想看到所有資訊,則必須切換到 root 使用者 啟用internet連線 伺服器和已建立連線的...
套介面程式設計理論基礎 正常啟動
啟動伺服器端程式 zhaoxj make tcpserv01 gcc i.lib g o2 d reentrant wall c o tcpserv01.o tcpserv01.c gcc i.lib g o2 d reentrant wall o tcpserv01 tcpserv01.o lib...
dns伺服器理論基礎知識
一 什麼是dns 在網際網路上通訊需要借助於ip位址,但人類對於數字的記憶能力遠不如文字,那麼將ip位址轉換成容易記憶的文字是個好辦法,可是計算機只能識別0 1 這時就需要一種機制來解決ip位址與主機名的轉換問題。早期由於網路上的主機數量有限,主機名和ip的解析借助於hosts檔案即可完成,linu...