多任务编程
1进程基础操作
- 创建-- fork
- 执行--exec
- 结束[--exit/ exit return(main)
- 孤儿进程
- 僵尸态进程
- 进程回收--wait/waitpid
2进程间通信
1同主机进程间通信:
- 管道
- 信号
- 共享内存
- 消息队列
- 信号灯集
2不同主机间的进程间通信
- socket
3线程 基础操作
- 创建pthread_create执行线程回调函数
- 结束
- pthread_exit
- return
- pthread_cancel
- //exit
- 线程资源回收:
- //pthread detach 分离属性 结合属性
- pthread_join
4线程间(同步+互斥)
- 互斥锁pthread_mutex
- 信号量sem
5进程vs线程
- 进程和线程 都是系统执行任务
- 进程:资源分配的基本单位
- 线程:调度执行的最小单位
- 进程的创建 和 切换 的开销 大
- 进程间通信空间独立------安全,稳定
- 线程的创建 和切换 的开销 小
- 线程共享进程资源方便
- 线程间资源竞争------线程间的同步互斥机制
不同主机间的进程间通信
网络:
- 无线:4G /5G 卫星 有线:光纤
- 通信:
- 物理层面问题---通路
- 逻辑层面问题---逻辑上软件层面链接
1什么是ip地址
- IP地址是主机的唯一标识,网络地址和主机号组成
- 网络地址是子网的唯一标识,类似于电话号码的区号;主机号是子网内每台主机的编号
- IP地址本质是32bit的二进制数,点分十进制表示(划分为4个字节,每个字节转化成相应的十进制数,字节之间用"."来分隔)

|----|-----------------------|-------------------------|---------------|
| 类型 | 范围 | 用途 ||
| A类 0.x.x.x---127.x.x.x.x || 10.x.x.x | 私网(局域网)地址 |
| A类 0.x.x.x---127.x.x.x.x || 127.x.x.x | 环回网络地址 |
| A类 0.x.x.x---127.x.x.x.x || 其他 | 大型主干网地址 |
| B类 128.x.x.x - 191.x.x.x || 172.16.x.x - 172.31.x.x | 私网(局域网)地址 |
| B类 128.x.x.x - 191.x.x.x || 169.254.x.x | 表示没有找到DHCP服务器 |
| B类 128.x.x.x - 191.x.x.x || 其他 | 主干(城市)网地址 |
| C类 | 192.x.x.x - 223.x.x.x | 192.168.x.x | 私网(局域网)地址 |
| D类 | 组播地址 |||
| E类 | 保留 |||
2什么是子网掩码?
- 255.255.255.0
- IP地址与子网掩码按位取与运算------获取IP地址中的网络地址和主机地址

3.什么是网关
一个网络到另一个网络的关口。
4DNS(域名解析系统)
将www.baidu.com(域名,计算机名,人类好记忆的网址)转换成百度服务器的IP地址
5 OSI模型七层模型(open system internet)
(物理链路和逻辑链路都连通才能实现通信)

应用层 //表示一层会话层
表示层 //压缩 加密
会话层 //管理一次通信过程
传输层 //传输过程中网络信息
控制网络层 //网络间如何通信
数据链路层 //01组合的数据帧物理层
物理层 //物理通信 电气特性
6tcp/ip模型
OSI是一个参考模型(教学模型),实际用到网络层次--- tcp/ip模型

7tcp/ip 4层模型 5层模型区别
(每层之间通过协议连接,物理层和数据链路层连接紧密,4/5区别在于此)

8Linux和网络模型的联系
- linux一切皆文件,提供一个网络操作的特殊文件socket
1.socket是网络通信的特殊文件
2.socket也是linux系统提供的一个编程接口
3通过这个编程接口,就可以使用到linux的网络功能

9封包---解包过程(类似于寄快递拆快递),每层之间通过协议(prtocol)连接

10两个重要协议 :
1.TCP(transmision control protocol) :(类似 打电话)---可靠(1.连接 2.可靠传输 3.字节流)
特点:a.面向连接(就是在进行通信之前,必须建立好一条逻辑上的通路)
b.提供可靠传输(四个"无",无丢失,无失序,无差错,无重复)
建立连接:
tcp三次握手 目的:建立连接
client--------------server
step1 《我要通话》 //连接的请求
step2《嗯,我知道了,你可以--》 //对方接听电话 喂
step3《嗯,好的》//喂
可靠的连接//类似打电话
2.UDP(User datagram Protocol) :(类似 生活中的广播)(1.不可靠,2.无连接 3.数据报)
特点:不提供可靠传输,
在数据发送时,不需要建立连接
应用:(1).小数据,但是对速度要求较高:(QQ.及时文本信息,语音等实时性要求较高场合)
(2).广播,组播//电子教师(vnc-广播)
(3).无线网的传输//udp
网络通信模式:
c/sclient 客户端/server服务器
b/sbrowser浏览器 server服务器
p2p peer to peer 点对点(人越多越快)
11基于tcp学习tcp网络编程模型:
基于TCP客户_服务器程序的套接字函数

套接字在程序中的位置:

tcp通信 类似 打电话
tcp客户端: //角色---主动的一方
- socket//买了个电话)
- bind(可选)//买了sim卡
- connect//拨打电话
- write
- read
- close
tcp服务器://角色被动的一方
- socket//买了个电话
- bind//买了sim卡
- listen//监听~-待机
- accept//接听
- read //通信
- write
- close //挂机
12 客户端函数接口:

- socket函数
cpp
socket函数
#include <sys/types.h>
#include <sys/socket.h>
int sodket(int domain,int type,int protocol);
功能:
创建了通信的一端
返回文件描述符
参数:
@domain //域-- 范围(是选本地的 还是网络的)
//ip地址
// ipv4 32位数据
// ipv6 128位 ipv6:更大范围地分配ip地址(地球上每一粒沙子都能分到一个IP地址)
//本地套接字
//protocol //协议
AF_INET
@type//用来说明socket这种网络通信的文件的类型
SOCK_STREAM //流式套接字
Provides sequenced,reliable,two-way(双工),connection-based byte streams.
Anout-of-band data transmission mechanism may be supported.An
SOCK DGRAM //数据报套接字
Supports dataqrams(connectionless,unreliable messaqes of a fixed maximum length)
@protocol //协议
0 // linux系统上 SOCK STREAM ---TCP
// 类linux系统行
//SOCK DGRAM --- UDP
返回值:
成功 返回socket对应的fd
失败 -1 && errno被设置 //perror
connect函数
cpp
Connect
int connect(int sockfd,const struct sockaddr* addr,socklen taddrlen);
功能:
通过socket链接到指定的地址上
参数:
@sockfd socket创建的fd
@addr标识网络中一个进程对应的地址
ip:确定一台主机
端口号:用来标识一个网络通信的进程
ip+端口号
struct sockaddr *addr//不是通用的
socket 不同的通信范围
不同通信域 都有自己特定的结构体
ipv4通信域 的结构体:
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 - ip地址*/
};
/* Internet address.*/
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};
in_addr_t inet_addr(const char *cp);
cp 表示要用的ip地址的字符串 //点分十进制
"192.168.0.150"
返回:网络字节序形式的ip地址的32位数值
@addrlen
说明 第二个参数的地址类型的大小
返回值:
成功0
失败 -1&&errno
端口号:16位的整型数据
0~1023 //1024---知名端口号
//http -- 80
1024~50000//特定端口号
50000~//临时分配的端口号
计算机的大小端内存和网络字节序发送的时候必须转换:--- 网络字节序(大端)
接收 : --- 根据主机的大小端转换
cpp#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(uintl6_t netshort);
h-- host
to -- 到
n --network
l -- long//处理4字节数据
s --short//处理2字节数据
cppin_addr_t inet_addr(const char *cp); cp 表示要用的ip地址的字符串 //点分十进制 "192.168.0.150" 返回: 网络字节序形式的ip地址的32位数值
13服务器端函数接口:
socket (同上)
bind:
cpp
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
int bind (int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:
给sockfd 绑定一个地址信息(ip+port)
参数:
@sockfd --- 要操作的socket
@addr --- 要绑定的地址信息
@addrlen --- 地址信息对应的大小
返回值:
成功 0
失败 -1&&errno
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int listen(int sockfd, int backlog);
功能:
将sockfd对应的socket设置为监听套接字
//这个套接字 负责看 有没有客户端,发送连接请求
//有了放等待队列中
参数:
@sockfd ---socket 的fd
@backlog --- 等待队列的长度
返回值:
成功 0
失败 -1&&errno
//dos 攻击
accept
cpp
int accept (int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:
从监听的socket中提取连接请求,完成连接(三次握手)
返回已连接的一个新socket
参数:
@sockfd --- 监听的socket的fd
@addr --- 用来存放,客户端的地址信息
@addrlen --- 值结果参数
注意: 必须初始化 ,初始成 addr对应sockaddr_in 类型的大小
返回值:
成功 返回 已连接的socket的fd //专门用于后面通信的
失败 -1 &&errno
cppbzro函数: 把结构体初始化 0 #include<strings.h> bzero(地址,大小);
cppchar *inet_ntoa(struct in_addr in); //将网络字节序形式的ip地址 转换为 点分十进制格式的 ip 字符串

ex1:
客户端给服务器发消息
服务器再回发消息
tcp 客户端
clifd = socket
connect
fgets//stdin
write (clifd)
read (clifd)
tcp 服务器
listenfd = socket
bind
listen
connfd = accept()
read(connfd)
sprintf(sbuf,"server+%s",rbuf);
write(connfd,sbuf)

ex2:
客户端 与 服务器实现一个点对点聊天
tcp 客户端
clifd = socket
connect
//收 --父进程
//发 --子进程
tcp 服务器
listenfd = socket
bind
listen
connfd = accept()
//收 -- 父进程
//发 -- 子进程
12基于udp学习 tcp网络编程模型