套介面程式設計理論基礎 正常啟動

2022-07-03 18:54:09 字數 3360 閱讀 5131

啟動伺服器端程式

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系統,有登入模組 發貼模組等等。要發貼就必須先登入,那麼這兩個模組就得有互動,它就必須要給出乙個介面...