unix網絡編程 chapter01_簡介

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服務

CentOS7搭建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[]` 的定義。
如果,你知道的話,請留言。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章