套介面程式設計理論基礎 伺服器程序終止

2021-09-08 23:49:21 字數 1661 閱讀 6282

啟動我們的客戶/伺服器程式對,然後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...