當客戶關閉連線,那麼伺服器的read函式接收到客戶的fin將導致其返回0。
正常終止客戶和伺服器的步驟:
(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(即伺服器tcp遞送乙個eof給子程序阻塞中的readline)。這導致str_echo函式返回伺服器子程序的main函式。
(5)伺服器子程序通過呼叫exit來終止。
(6)伺服器子程序中開啟的所有描述符隨之關閉。由子程序來關閉已連線套接字會引發tcp連線終止序列的最後兩個分節:乙個從伺服器到客戶的fin和乙個從客戶到伺服器的ack。至此,連線完全終止,客戶套接字進入time_wait狀態。
(7)程序終止處理的另一部分內容是:在伺服器子程序終止時,給父程序傳送乙個sigchld訊號。父程序不處理該訊號的話,預設行為是忽略,會導致子程序進入僵死狀態。(當sighld訊號遞送時,既然該訊號時在父程序阻塞於慢系統呼叫(accept)時由父程序捕獲的,核心就會使accept返回乙個eintr錯誤(被中斷的系統呼叫),而父程序不處理該錯誤,於是終止)
訊號(signal)就是告知某個程序發生了某個事件的通知,有時也稱為軟體中斷。訊號通常是非同步發生的,也就是說程序預先不知道訊號的準確發生時刻。
訊號可以:
1)由乙個程序發給另乙個程序(或自身);
2)由核心發給某個程序;
例如:sigchld就是核心在任何乙個程序終止時發給父程序的乙個訊號。
僵死程序
設定僵死狀態的目的是維護子程序的資訊,以便父程序在以後某個時候獲取。如果乙個程序終止,而該程序有子程序處於僵死狀態,那麼它的所有僵死子程序的父程序id將被重置為1(init程序)。繼承這些子程序的init程序將清理它們(也就是說init程序將wait它們,從而去除它們的僵死狀態)。
阻塞式系統呼叫是指因為目前沒有必要資源可用而必須等待,知道這些資源變為可用後才能返回。等待期間程序進入睡眠狀態。 非阻塞式系統呼叫是指即使沒有必要資源可用也立即返回,不過會告訴呼叫者發生了這種情況,這樣呼叫者可以繼續呼叫同乙個系統呼叫。
第5章 Web伺服器
了解web伺服器是如何處理http事務的。2.1 web伺服器 web伺服器實現了http和相關的tcp連線處理。負責管理web伺服器提供的資源,以及對web伺服器的配置,控制及擴充套件方面的管理。2.2 通用軟體web伺服器 通用軟體web伺服器都執行在標準的,有網路功能的計算機系統上。比如開源軟...
tcp 客戶 伺服器程式示例
1 client 從標準輸入讀入一行文字,並寫給伺服器。2 伺服器從網路輸入讀入這行文字,並回射給客戶。3 客戶從網路輸入讀入這行回射的文字,顯示在標準輸出上 標準輸入 fgets tcp 客戶 write read tcp 伺服器 標準輸出 fputs tcp 客戶 read write tcp ...
TCP客戶 伺服器程式例項
1.概述 這章的tcp客戶 伺服器模型 2.tcp回射伺服器程式 1 main函式 include unp.h int main int argc,char argv close connfd parent closes connected socket 2 str echo函式 include u...