chapter01_簡介
這篇文章是我自己看的,整理自己的思路,僅放在網上便於保存&&分享。
相對於書而言,內容沒有什麼價值。書上的內容全面可靠。
PS:文章是建立在我的知識體系之上。因而,文中也不會有多餘解釋。
一、內容
書名是《unix網絡編程》。
顧名思義,這本書的內容是:編寫計算機網絡通信的程序。這些程序通過網絡,可以相互通信。
通信之前,要達成協議。就像打電話一樣,一個人說火星語,一個人說四川話。這是行不通的。我還挺喜歡挺四川話。
Web客戶與服務器之間使用TCP(Transmission Control Protocol, 傳輸控制協議) 通信。 TCP又轉而使用IP(Internet Protocol, 網際協議) 通信, IP再通過某種形式的數據鏈路層通信。(如果,學過《計算機網絡》-謝希仁 ;大體上能明白下面這張圖的意思。)
這裏,我們順帶也列出網際協議族中的各層。當然,本書的焦點是: 如何使用套接字編寫使用TCP或UDP的網絡應用程序。
二、實驗
題目:一個簡單的時間獲取客戶程序
能動手就別吵吵;我們來看下。
1、環境的搭建
當然參考網上隨便搜搜就有。比如:一個簡單的時間獲取客戶端/服務器程序(疑難解決)
源碼下載 + 閱讀README + 上面參考 = 環境搭建完成
2、編譯程序
編譯客戶端時間獲取程序:
可以參考《跟我一起寫makefile》&&《gcc中文手冊》。由於是第一次列出,我解釋下參數含義。
#intro目錄
make daytimetcpcli
##輸出如下:
### -I 指定頭文件路徑; -g 產生調試信息; -O2 優化選項 ;
### -D 預處理; -Wall 警告 ; -c 僅編譯; -o 指定輸出文件; -l 指定庫
gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o daytimetcpcli.o daytimetcpcli.c
gcc -I../lib -g -O2 -D_REENTRANT -Wall -o daytimetcpcli daytimetcpcli.o ../libunp.a -lpthread
3、搭建NTP服務
4、驗證
#下面這個ip對應的是騰訊服務器。可能以後不再續費。
./daytimetcpcli 49.234.233.219
#輸出
16 MAR 2020 19:57:46 CST
5、服務器程序
同上,略;
附錄
1、代碼
程序不長,我便列出來。
#include "unp.h"
int
main(int argc, char **argv)
{
int sockfd, n;
char recvline[MAXLINE + 1];
struct sockaddr_in servaddr;
if (argc != 2)
err_quit("usage: a.out <IPaddress>");
//socket 創建一個TCP套接字
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
err_sys("socket error");
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(13); /* daytime server */
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
err_quit("inet_pton error for %s", argv[1]);
//與目標服務器建立連接
if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
err_sys("connect error");
//讀入並輸出服務器的應答
while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
recvline[n] = 0; /* null terminate */
if (fputs(recvline, stdout) == EOF)
err_sys("fputs error");
}
if (n < 0)
err_sys("read error");
exit(0);
}
2、Unix errno值
全局變量 errno
就被置爲一個指明該錯誤類型的正值, 函數本身則通常返回-1
3、Unix標準
我們簡單地稱這個Unix標準爲POSIX規範(The POSIX Specification)。
POSIX(可移植操作系統接口) 是Portable Operating System Interface的首字母縮寫。 它並不是單個標準, 而是由電氣與電子工程師學會(the Institute for Electrical and Electronics Engineers, Inc.) 即IEEE開發的一系列標準。
4、自定義的err_sys( )函數
如果感興趣的話,可以自行分析下這個函數的實現。
也是後面習題1.3的分析過程。
C 可變參數 + snprintf與vsnprintf函數 + extern關鍵字 + UNIX 程序中的錯誤代碼 ----> over
#文件/usr/include/errno.h中
我並沒有找到 全局變量 `sys_errlist[]` 的定義。
如果,你知道的話,請留言。