UNIX網路程式設計學習(11)--分析TCP回射服務+客戶程式:正常啟動與正常終止
分析TCP回射服務+客戶程式:
啟動伺服器程式後,netstat -a,後終端出現:
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 *:9877 *:* LISTEN
其中本地埠為9877正是我們啟動的伺服器應用
啟動我們的客戶/伺服器程式對,
通過三次握手,連線建立。接著發生的步驟:
1.客戶端呼叫str_cli 函式,該函式將阻塞於fgets呼叫。因為我們還沒鍵入一行文字
2.當伺服器中的accept返回時,伺服器呼叫fork,再由子程式呼叫str_echo。str_echo呼叫readline,readline呼叫read,
read在等待客戶送入一行文字期間阻塞
3.另一方面,伺服器父程式再次呼叫accept並阻塞,等待下一個客戶連線
終端netstat -a後,終端顯示:
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 *:9877 *:* LISTEN
tcp 0 0 localhost.localdoma:ipp *:* LISTEN
tcp 0 0 *:daytime *:* LISTEN
tcp 0 0 localhost.localdo:55817 localhost.localdom:9877 ESTABLISHED
tcp 0 0 localhost.localdom:9877 localhost.localdo:55817 ESTABLISHED
tcp6 0 0 ubuntu:ipp [::]:* LISTEN
udp 0 0 *:52444 *:*
第二個ESTABLISHED的本地埠號為9877,可判斷出其對應伺服器子程式的套介面;第一個ESTABLISHED的本地埠號是55817,
可判斷出其對應客戶程式的套介面。
zhouzhou@ubuntu:~/Desktop$ ps -a -o pid,ppid,stat,args,wchan
PID PPID STAT COMMAND WCHAN
8780 8779 S+ sh -c LD_LIBRARY_PATH=$LD_L wait
8781 8780 S+ /home/fupeng/Desktop/codebl inet_csk_wait_for_connect
8993 8992 S+ sh -c LD_LIBRARY_PATH=$LD_L wait
8994 8993 S+ /home/fupeng/Desktop/codebl n_tty_read
8995 8781 S+ /home/fupeng/Desktop/codebl sk_wait_data
9194 4449 R+ ps -a -o pid,ppid,stat,args -
簡略:
PID PPID STAT COMMAND WCHAN
8781 8780 S+ /home/fupeng/Desktop/codebl inet_csk_wait_for_connect 判斷為父程式
8994 8993 S+ /home/fupeng/Desktop/codebl n_tty_read 判斷為客戶程式
8995 8781 S+ /home/fupeng/Desktop/codebl sk_wait_data 判斷為子程式
伺服器和客戶程式都啟動時:
zhouzhou@ubuntu:~/Desktop$ netstat -a | grep 9877
tcp 0 0 *:9877 *:* LISTEN
tcp 0 0 localhost.localdom:9877 localhost.localdo:54491 ESTABLISHED
tcp 0 0 localhost.localdo:54491 localhost.localdom:9877 ESTABLISHED
客戶端(ctrl+d結束後,),會經歷如下:客戶端會經歷一個TIME_WAIT 狀態。
zhouzhou@ubuntu:~/Desktop$ netstat -a | grep 9877
tcp 0 0 *:9877 *:* LISTEN
tcp 0 0 localhost.localdo:54491 localhost.localdom:9877 TIME_WAIT
zhouzhou@ubuntu:~/Desktop$ netstat -a | grep 9877
tcp 0 0 *:9877 *:* LISTEN
當前連線的客戶端(本地埠號)進入了TIME_WAIT狀態,而監聽伺服器仍在等待另一個客戶連線。
正常終止客戶和伺服器的步驟:
1.當我們鍵入<Ctr-D>EOF字元時,fgets返回一個空指標,str_cli函式返回。
2.當str_cli返回到客戶的main函式時,main通過exit終止。
3.程式終止時的一部分操作是關閉所有開啟的描述字,客戶開啟的描述字由核心關閉。這導致客戶tcp傳送一個FIN給伺服器,伺服器TCP則以ACK響應,這是TCP連線終止的前半部操作。至此,伺服器介面處於CLOSE_WAIT狀態,客戶套介面處於FIN_WAIT_2狀態。
4.當伺服器TCP接受FIN時,伺服器子程式阻塞於readline呼叫,於是readline返回0.這導致str_echo函式返回伺服器子程式的main函式
5.伺服器子程式通過呼叫exit來終止。
6.伺服器子程式開啟的所有描述字隨之關閉。由子程式關閉已連線套介面引發TCP連線終止序列最後兩個分節:一個是從伺服器到客戶的FIN;另一個是從客戶到伺服器的ACK。至此,連線完全終止,客戶套介面進入TIME_WAIT狀態
7.程式終止處理的另一部分內容是:在伺服器子程式終止時,會給父程式傳送一個SIGCHLD訊號。該訊號的預設行為被忽略。
這時,我們檢視程式,子程式進入殭屍狀態。
zhouzhou@ubuntu:~/Desktop$ ps -a -o pid,ppid,stat,args,wchan
PID PPID STAT COMMAND WCHAN
8780 8779 S+ sh -c LD_LIBRARY_PATH=$LD_L wait
8781 8780 S+ /home/fupeng/Desktop/codebl inet_csk_wait_for_connect
8995 8781 Z+ [unp2] <defunct> exit
9355 8781 Z+ [unp2] <defunct> exit
9581 4449 R+ ps -a -o pid,ppid,stat,args -
後續,我們將學習去清理僵死程式。
相關文章
- UNIX網路程式設計學習(18)--UDP回射(伺服器+客戶端)程式程式設計UDP伺服器客戶端
- 001 Rust 網路程式設計,實現 TCP 服務端和客戶端程式Rust程式設計TCP服務端客戶端
- UNIX網路程式設計學習(1)--開啟ubuntu daytime服務程式設計Ubuntu
- TCP程式設計之服務端和客戶端的開發TCP程式設計服務端客戶端
- golang實現tcp客戶端服務端程式GolangTCP客戶端服務端
- UNIX網路程式設計學習(16)--使用poll的TCP伺服器程式程式設計TCP伺服器
- UNIX網路程式設計學習(15)--使用單程式和select的TCP伺服器程式程式設計TCP伺服器
- 《Unix 網路程式設計》05:TCP C/S 程式示例程式設計TCP
- Linux系統程式設計(34)—— socket程式設計之TCP伺服器與客戶端的互動Linux程式設計TCP伺服器客戶端
- 達夢資料庫dmap服務無法正常啟動資料庫
- 第十一篇:基於TCP的一對回射客戶/伺服器程式及其執行過程分析( 下 )TCP伺服器
- TCP/IP之TCP的建立與終止TCP
- python 學習-- TCP程式設計PythonTCP程式設計
- 學習四:jobtracker和tasktracker無法正常啟動
- 無法啟動mysql服務”1067 程式意外終止”解決辦法【簡記】MySql
- UNIX網路程式設計學習(10)續--處理accept返回EINTR錯誤的TCP伺服器程式最終(正確)版本程式設計TCP伺服器
- java TCP入門程式設計(檔案傳送、服務端接收多個客戶端請求)JavaTCP程式設計服務端客戶端
- 5.9 TSM的客戶端(ORACLE資料庫)排程程式不能啟動導致備份不正常客戶端Oracle資料庫
- UINX 網路程式設計學習(2)--簡單的時間獲取客戶程式UI程式設計
- UNIX網路程式設計學習(8)--伺服器端顯示客戶端的IP地址和埠號程式設計伺服器客戶端
- docker 不能正常啟動Docker
- 第十篇:基於TCP的一對回射客戶/伺服器程式及其執行過程分析( 上 )TCP伺服器
- win10安裝程式無法正常啟動怎麼辦_win10安裝程式無法正常啟動如何解決Win10
- 當程式不能正常工作時,程式設計師的常用藉口程式設計師
- win10快速啟動怎麼改正常啟動_win10快速啟動設定為正常啟動如何操作Win10
- Linux學習/TCP程式設計學習筆記LinuxTCP程式設計筆記
- 基於c語言的TCP客戶端、服務端基礎程式碼C語言TCP客戶端服務端
- 網路程式設計中TCP與UDP程式設計TCPUDP
- 利用WinSW將Nginx 作為可正常啟動/停止的windows服務NginxWindows
- UNIX網路程式設計學習(4)--值-結果引數程式設計
- Unix哲學(Unix程式設計藝術)程式設計
- Unix程式設計藝術,Unix哲學程式設計
- Java Tcp協議socket程式設計學習JavaTCP協議程式設計
- 併發程式設計——如何終止執行緒程式設計執行緒
- python建立tcp服務端和客戶端PythonTCP服務端客戶端
- 網路卡驅動程式不正常上不了網怎麼修復(win7、win10) 網路卡驅動不正常不能連線網路Win7Win10
- linux下啟動和終止JAVA程式shell指令碼LinuxJava指令碼
- PHP實現守護程式的啟動和終止操作PHP