TCP C S 示例詳解

2021-06-21 21:50:48 字數 1677 閱讀 4749

下面的**實現 echo 回射功能,下面具體分析啟動與終止過程。

#include "unp.h"

int main(int argc,char**argv)

close(connfd); }}

void str_echo(int connfd)

//int main(int argc,char**argv)

void str_cli(file*fp,int sockfd)

}

1,首先,伺服器啟動,它呼叫socket,bind ,listen,accept,並阻塞與accept呼叫,我們還沒有啟動客戶。此時,檢視套接字情況netstat

有乙個套接字處於listen的狀態,

2,然後,啟動客戶,客戶呼叫socket和connect,後者引發三次握手過程,當三路握手完成後,客戶中的connect和accept均返回,於是鏈結建立。

a,客戶呼叫str_cli函式,該函式阻塞與fgets呼叫。

b,   伺服器accept返回後,呼叫fork,再由子程序呼叫str_echo。該函式阻塞與read呼叫,等待讀入資料。

c, 另一方面,伺服器父程序再次呼叫accept並阻塞,等待下乙個客戶連線。

自此,有三個程序都在眠,客戶程序,伺服器父程序,伺服器子程序。

當三路握手完成後,我們首先列出客戶的步驟,然後列出伺服器的步驟,是有原因的:客戶接受到三路握手的第二個分節(ack+syn)connect就返回了,而伺服器要等到三路

握手的第三個分節才返回(ack)即在connect返回之後再過半個rtt才返回。

此時,再次檢視套接字狀態,可以看到,有兩個establied,乙個listen 態,(因為我們是在同一主機執行客戶與伺服器的)。

終止:在客戶端,我們鍵入終端字元eof字元(ctrl+d)以終止客戶,此時,如果立即執行netstat命令(立即,因為過段時間,套接字狀態會有變化)。

可以看到,當前鏈結的客戶端套接字進入了time_wait狀態,伺服器父程序仍在listen狀態。

可以總結出:

1,當我們鍵入eof字元釋,fgets返回乙個空指標,於是str_cli函式返回。

2,當str_cli返回到客戶的main函式時候,main函式通過exit終止。

3,程序終止處理的部分工作是關閉所有開啟的描述符,當然包括套接字,因此客戶開啟的套接字由核心關閉。這導致客戶tcp傳送乙個fin分節給伺服器,伺服器則ack響應,

這就是tcp連線終止序列的前半部分。(注意到,這時候的伺服器子程序還是存在的),自此,伺服器子程序套接字處於close_wait狀態,客戶套接字則處於fin_wait_2

狀態(接受了ack分節後從fin_wait_1變遷的). 

4, 當伺服器紫禁城tcp接受到fin時候,伺服器紫禁城阻塞於read呼叫,於是read返回0,這導致str_echo函式返回伺服器子程序的main函式。

5,伺服器子程序通過呼叫exit(0)來終止

自此,連線完全終止,客戶套接字進入time_wait狀態(需要等待一段時間才關閉),伺服器子程序套接字關閉了。

6,程序終止處理的另乙個部分:在伺服器子程序終止時,給父程序傳送乙個sigchld訊號。這一點在本例中發生了,但是我們沒有捕獲處理,既然附近成沒有處理

那麼紫禁城於是進入僵死狀態。 這可以用ps命令看到。

玩                           

layout weight詳解示例

layout wlayout weight 表示該view 控制項佔據父控制項剩餘空間的比例 示例 1.未使用layout weight 第乙個 linearlayout 將父控制項全部覆蓋,無法顯示第二個。如果android layout height wrap content android l...

libconfig 示例詳解

libconfig 是乙個用於處理結構化配置檔案的簡單庫。libconfig 的配置的檔案格式非常簡潔,可讀性也非常的好,而且是type aware,普通的配置檔案讀取後訪問的型別為字串,libconfig 可以 識別 整形的配置。libconfig 的配置形式也非常的靈活。此外,libconfig...

TCP CS檔案傳輸 傳送端

思路 1,建立連線請求 2,通過命令列引數,提取檔名 帶路徑 os.args 3,獲取檔案屬性,獲取檔名 不帶路徑 os.stat 4,傳送檔名給接收端 5,驗證接收端是否回應,在此用回執 ok 字串判斷 6,如果接收成功,則進行檔案傳送操作 1 以唯讀方式開啟待傳送檔案 2 讀指定檔案到buf中 ...