零 下载资料包 网络1.zip
补充:
打开多个vim chuangkou:
在命令模式下输入: vsp xxxx.x
vs xxxx.x
切换的方法:ctrl + WW
一 回忆昨天的内容
动态加载 (按需加载)
dlopen
dlclose
dlerror -ldl
dlsym
文件的操作 fopen fclose
文件夹的操作 opendir closedir
文件和文件夹的权限问题
系统中错误处理
errno
perror ();
strerror ();
sizeof 计算的是类型的大小!
int var;
sizeof (int); = sizeof (var);
二 基于TCP/IP的网络通信及实现
2.1 网络的基础知识
服务器是什么?
服务是软件 器是硬件
C/S架构: Client Server
单路
双路
四路 32 64
什么是协议?
protocol 规则 标准 约定 计算机的术语称为协议
客户端和服务端要遵循TCP/IP 协议簇
TCP/IP协议分为四层:
应用层 传输层 网络层 链路层 物理层
Phy
物理层 电气协议 A/D <----> D/A
链路层 以太网帧的定义
数据是按帧进行传递的
以太网帧
令牌环网帧
......
一帧数据46~1500个字节,吞吐量
CRC是4位校验码
6字节目的地址是MAC目的地址
6字节源地址MAC源地址
48位 MAC地址
4G * 64K = 256T
MAC 地址相当于身份证,IP地址相当于名字
IP 地址是逻辑地址
如何查看自己的IP?
ifconfig
ip a
IP 地址和MAC地址需要进行绑定
IP地址和MAC地址之间的互换靠 ARP/RARP 完成
以太网帧的分用过程
网帧 帧头 帧体 帧尾
IP 报文有一定的组织格式
最需要关注的是4位的首部长度
0~15位的值限制了记录路由选项,4个字节为一个单位。
8位的协议:下一层的协议。
指定出此数据包携带的数据采用何种协议,以便目的主机
的IP层将数据部分上交给哪个进程进行处理。
32位源IP地址
32位目的IP地址
解析到的报体传输到下一层,下一层采用什么协议,
报体就以什么包的形式进行传输。
假如说传输的包头中的Protocol是TCP的:
TCP协议也有一定的组织格式:
TCP 中16位的目的端口号,将来决定传给哪个应用程序。
端口号是从 0~65535,1000一下不要用。
进程要监听端口,当有请求到来时,接受请求。
IP地址一共有5类
IP地址有网络地址和主机地址
最常用的是B类和C类
192.168.1.188
0~255.0~255.0~255.0~255
网络号 + 主机号
需要从IP地址中提取出来网络号
子网掩码:
255.255.255.0
&
192.168.1.188
----------------
192.168.1.0 ---》 网络号
192.168.1.134/24 255.255.255.0
192.168.1.134/25 255.255.255.128
192.168.1.134
&
255.255.255.128
------------------
192.168.1.128 ---》 还剩7位主机号,
最多还有128台机器
理解三个网络设备:
集线器 电信号的放大和分流而已
交换机 交换的是网帧
路由器 交换的是ip报文
基于TCP的网络编程模型
服务端编程模型
1.建立通信端点,返回一个文件描述符 listenfd
2.将listenfd和服务器的IP和端口号进行绑定
3.将设备设置成被动连接状态,监听客户端连接的到来,
把请求放入未决连接队列中。listen ();
while (1) {
4.从未决连接队列中取出来第一个未决连接进行处理,
accept(2),返回一个文件描述符cfd,cfd就是服务端和
客户端的连接,如果未决连接队列为空,阻塞等待。
5.cfd从客户端读取请求数据,read(2);
6.处理客户的请求。
7.将处理结果发送给客户端.write(2);
8.关闭本次链接.close(2);
}
客户端编程模型:
1.建立通信端点 socket(2)
2.lfd用于连接服务器. connect(2)
3.使用lfd向服务器发送请求信息 write(2)
4.阻塞等待服务器的响应
5.将服务器的响应信息进行处理
6.关闭连接
socket (2)
功能:
创建一个通信端点
参数:
domain:
AF_INET IPv4 Internet protocols ip(7)
AF_INET6 IPv6 Internet protocols ipv6(7)
type:
SOCK_STREAM 提供可靠的,双向的,基于连接的 TCP
SOCK_DGRAM UDP
protocol:
0
返回值:
成功 返回一个文件描述符
错误 -1 errno 被设置
bind:
功能:
将地址绑定到socket上
参数:
sockfd: 指定了具体的socket
addr: 具体的地址
addrlen: 指定了addr指向空间的大小
返回值:
成功:0
错误:-1 ,errno被设置
accept (2)
功能
接受一个连接
参数
sockfd: 设置为监听的那个socket,从这个socket的未决
连接队列中取出来第一个未决处理,进行处理。
addr: 值-结果参数,将对面的地址填充到addr所指向的
地址空间。
addrlen:对面的地址所占的实际的大小
返回值
返回一个新的文件描述符,用于实现服务器和客户端的通讯。
connect:
功能:
在指定的socket上发起一个连接
参数:
sockfd: 指定了socket
addr: 指定了服务器的地址和端口号
addrlen: addr的大小
返回值:
成功 0
错误 -1
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
};
struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order */
struct in_addr sin_addr; /* internet address */
};
/* Internet address. */
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};
192.168.1.123 点分十进制
无符号整形数据
网络字节序 (大端)
主机字节序转换成网络字节序
htons (2) h -->host n --> network
l--->long s --> short
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
需要将ip地址的字符串和长整型进行互转
inet_pton (3)
#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);
功能:
text ---> binary
参数:
af: AF_INET AF_INET6
src:指定一个字符串,将IPV4的ip地址转换成网络字节序
dst: 存放转换后的结果
返回值:
成功 1
错误 0 地址无效
-1 地址不合法
#include <arpa/inet.h>
const char *inet_ntop(int af, const void *src,
char *dst, socklen_t size);
功能:
binary --->text 网络地址转换为字符串
参数:
af:AF_INET AF_INET6
src: in_addr 网络地址
dst: 存放转换后的结果
size: 指定dst空间的大小
返回值:
成功: 返回转换后的字符串
错误: NULL