要編寫通過計算機網路通訊的程式,首先要確定這些程式相互通訊所用的協議。
一般認為web伺服器程式是乙個長時間執行的程式(守護程式,daemon)它只在響應來自網路的請求時才傳送網路訊息。協議的另一端是web客戶程式,如某種瀏覽器,與伺服器程序的通訊總是由客戶程序發起。
在設計網路應用時,確定總是由客戶發起請求往往能夠簡化協議和程式本身。
下例是tcp當前時間查詢客戶程式的乙個實現。該客戶與其伺服器建立乙個tcp連線後,伺服器以直觀可讀格式簡單地送回當前時間和日期:
#include
"unp.h"
intmain
(int argc,
char
* ar**)
if(n<0)
err_sys
("read error");
exit(0
);}
gcc daytimetcpcli.c -o daytimetcpcli -lunp
編寫乙個簡單的tcp時間獲取伺服器程式,與前文的客戶程式一道工作:
#include
"unp.h"
#include
intmain
(int argc,
char
* ar**)
}
程式說明
建立tcp套接字
11 tcp套接字的建立與客戶程式相同
**埠到套接字
12-17 填寫乙個網際套接字位址結構,呼叫bind
函式,埠13被**到所建立的套接字。指定ip位址為inaddr_any
,如果伺服器主機有多個網路介面,伺服器程序就可以在任意網路介面上接受客戶連線。
把套接字轉換成監聽套接字
18 呼叫listen函式將套接字轉換為監聽套接字。socket
、bind
、listen
這3個呼叫步驟是任何tcp伺服器準備所謂的監聽描述符(listenfd
)的正常步驟。
接受客戶連線,傳送應答
20-25 通常情況下,伺服器程序在accept
呼叫中被投入睡眠,等待某個客戶連線的到達並被核心接受。經過tcp三次握手後,accept
返回,其返回值是乙個稱為已連線描述符的新描述符(connfd
)。該描述符用於與新近連線的那個客戶通訊。accept
為每個連線到本伺服器的客戶返回乙個新描述符。
終止連線
26 伺服器通過呼叫close
關閉與客戶的連線。該呼叫引發正常的tcp連線終止序列。
本伺服器程式一次只能處理乙個客戶,如果多個客戶連線差不多同時到達,系統核心在某個最大數目的限制下把它們排入佇列,然後每次返回乙個給accept
函式。
Unix 網路程式設計卷1
伺服器被動開啟 passive open socket bind listen。客戶端通過socket connect主動開啟 active open accept和connect是阻塞的 把目標位元組串指定數目的位元組置為c void memset void dest,int c,size t l...
unix網路程式設計第2版 卷1 第6章 同步
6.1概述 在5.12節中,我們看到tcp客戶同時處理兩個輸入 標準輸入和tcp套介面。我們遇到的問題是客戶阻塞於 標準輸入上的 fgets呼叫,而伺服器程序又被殺死。伺服器tcp雖正確地給客戶tcp發了乙個fin,但客戶程序正阻塞於從標準輸入讀入,它直到從套介面讀時才能看到此檔案結束符 可能已經過...
第1章 簡介
桉樹企業版 ee 2.0是乙個基於linux體系架構,對企業資源 硬體 儲存 網路 統一管理的雲平台。桉樹雲是iaas層面的雲平台,對基礎裝置進行管理和擴充套件,為企業提供私有雲 可以部署在企業的防火牆之內,僅供企業內部使用,確保資料的安全性 和混合雲部署方案。桉樹在設計之初就考慮了易用性 模組化和...