啟動伺服器端程式
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 ../libunp.a -lpthread
zhaoxj$ ./tcpserv01 &
[1] 13424
zhaoxj$ netstat -antp
(並非所有程序都能被檢測到,所有非本使用者的程序資訊將不會顯示,如果想看到所有資訊,則必須切換到 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 13424/tcpserv01
tcp 0 0 127.0.0.1:631 0.0.0.0:* listen
檢視tcp連線的監聽套介面,發現有三個套介面處於listen狀態,其中本地埠為9877正是我們啟動的伺服器應用
啟動客戶端程式(再開啟乙個終端)
zhaoxj$ make tcpcli01
gcc -i../lib -g -o2 -d_reentrant -wall -c -o tcpcli01.o tcpcli01.c
gcc -i../lib -g -o2 -d_reentrant -wall -o tcpcli01 tcpcli01.o ../libunp.a -lpthread
zhaoxj$ ./tcpcli01 127.0.0.1
通過三次握手,連線建立。接著發生的步驟:
1.客戶端呼叫str_cli 函式,該函式將阻塞於fgets呼叫。因為我們還沒鍵入一行文字
2.當伺服器中的accept返回時,伺服器呼叫fork,再由子程序呼叫str_echo。str_echo呼叫readline,readline呼叫read,
read在等待客戶送入一行文字期間阻塞
3.另一方面,伺服器父程序再次呼叫accept並阻塞,等待下乙個客戶連線
zhaoxj$ netstat -antp
(並非所有程序都能被檢測到,所有非本使用者的程序資訊將不會顯示,如果想看到所有資訊,則必須切換到 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 13424/tcpserv01
tcp 0 0 127.0.0.1:631 0.0.0.0:* listen -
tcp 0 0 127.0.0.1:9214 127.0.0.1:9877 established 13525/tcpcli01
tcp 0 0 127.0.0.1:9877 127.0.0.1:9214 established 13526/tcpserv01
tcp6 0 0 ::1:631 :::* listen -
第二個established的本地埠號為9877,可判斷出其對應伺服器子程序的套介面;第乙個established的本地埠號是9214,可判斷出其對應客戶程序的套介面。
zhaoxj$ ./tcpcli01 127.0.0.1
hello,world
hello,world
good bye
good bye
^d 結束客戶終端
此時立即執行netstat命令 可看到如下結果:
zhaoxj$ netstat -antcp|grep 9877
tcp 0 0 0.0.0.0:9877 0.0.0.0:* listen 13424/tcpserv01
tcp 0 0 127.0.0.1:9214 127.0.0.1:9877 time_wait -
tcp 0 0 0.0.0.0:9877 0.0.0.0:* listen 13424/tcpserv01
tcp 0 0 127.0.0.1:9214 127.0.0.1:9877 time_wait -
當前連線的客戶端(本地埠號9214)進入了time_wait狀態,而監聽伺服器仍在等待另乙個客戶連線。
正常終止客戶和伺服器的步驟:
1.當我們鍵入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訊號。該訊號的預設行為被忽略。
套介面程式設計理論基礎 伺服器程序終止
啟動我們的客戶 伺服器程式對,然後kill掉伺服器子程序。看看客戶端發生了什麼?伺服器端檢視結果 zhaoxj netstat antdp 並非所有程序都能被檢測到,所有非本使用者的程序資訊將不會顯示,如果想看到所有資訊,則必須切換到 root 使用者 啟用internet連線 伺服器和已建立連線的...
套介面程式設計理論基礎 伺服器程序終止
啟動我們的客戶 伺服器程式對,然後kill掉伺服器子程序。看看客戶端發生了什麼?伺服器端檢視結果 zhaoxj netstat antdp 並非所有程序都能被檢測到,所有非本使用者的程序資訊將不會顯示,如果想看到所有資訊,則必須切換到 root 使用者 啟用internet連線 伺服器和已建立連線的...
介面測試理論基礎
1.介面 什麼是介面呢?介面一般來說有兩種,一種是程式內部的介面,一種是系統對外的介面。1.1系統對外的介面 1.2程式內部的介面 方法與方法之間,模組與模組之間的互動,程式內部丟擲的介面,比如bbs系統,有登入模組 發貼模組等等。要發貼就必須先登入,那麼這兩個模組就得有互動,它就必須要給出乙個介面...