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