一、信号量(同步)
1.回顾:
一个进程控制另外一个进程
逻辑变量+pause/sleep+ 信号
2.信号量(semaphore)信号灯
三个数据:红灯/绿灯/黄灯
60 90 5
信号量是共享内存整数数组,根据需要定义指定的数组长度
信号量就是根据数组中的值,决定阻塞还是解除阻塞。
3.编程
3.1创建或者得到信号量 semget
3.2初始化信号量中指定下标的值 semctl
3.3根据信号量阻塞或者解除阻塞 semop
3.4删除信号量 semctl
案例:
A: B:
创建信号量 得到信号量
初始化信号量
根据信号量阻塞 解除阻塞
删除信号量
semget函数说明
intsemget(key_t key,
intnums, //信号量数组个数
intflags); //信号量的创建标记
//创建IPC_CREAT |IPC_EXCL | 0666
//打开 0
返回值:
-1:失败
>=0:成功,返回信号量的ID
intsemop(intsemid, //信号量ID
structsembuf *op, //对信号量的操作,操作可以是数组
size_tnums, //第二个参数的个数
返回值:
-1:失败
0:成功
intsemctl(int semid,
intnums, //对IPC_RMID 无意义
intcmd, //SETVAL IPC_RMID
...);//对IPC_RMID无意义
structsembuf
{
intsem_num; //下标
intsem_op;
intsem_flag; //建议为0
}
sem_op:
前提条件信号量是unsignedshort int;
不能<0
-:够减,则semop马上返回;不够减,则阻塞
+:执行+操作
0:判定信号量>0,则阻塞,直到为0
控制进程的搭配方式:
+(解除阻塞) -(阻塞)
0(阻塞) -(解除阻塞)
二、网络
1.基础(IP)
1.1网络工具
pingIP地址
ping-b IP广播地址最后一个是x.x.x.255
ifconfig-a
lsof
netstat-a ;所有正在显示的
netstat-u: UDP协议
netstat-t:正在支持的TCP协议
netstat-x: 基于本地UNIX的
netstat-n: 数组方式显示
route
1.2网络的基本概念
网络编程采用socket模型
网络通信本质也是进程之间的IPC。
是不同主机之间。
识别主机:4字节整数:IP地址
识别进程:2字节整数:端口号
IP地址的表示方法: 内部表示:4字节证书
外部表示:数点字符串
结构体
12 3 4 分段表示,每个段使用.分隔
IP地址的转换: cd/usr/include/bits/ cat netinet.h
structaddr_in
{
intsin_family; //4
int_port_tsin_port; //4
structin_addr sin_addr; //2
}
structin_addr
{
int_addr_ts_addr; //32bit = 4byte
}
总结:IP地址的表示
字符串表示法"123.123.123.123"
整数表示法in_addr_t;
结构体表示 structin_addr;
连接点:
endpont
structsockaddr_in
{
int_port_tsin_port;
structin_addr sin_addr;
}
1.3IP地址的转换
inet_addr// 把字符串转换为整数(网络字符串) (不建议用, 255.255.255.255转换会有问题)
inet_aton//把字符串转换为struct in_addr;(网络字符串)
inet_network//把字符串转换为整数(本地字节序)
inet_ntoa//把结构体专为字符串
htons
htonl
ntohs
ntohl
1.4IP地址的意义
IP地址的位表达不同意义:
IP地址组建网络。网络标识/主机标识
网络 主机
A类:7 24 网络少,主机多
B类:14 16
C类:21 8
D类:组播(集群)
E类:没有使用
1.5计算机系统中的网络配置
/etc/hosts文件:配置IP,域名,主机名
gethostbyname
gethostbyaddr
/etc/protocols文件:配置系统支持的协议
/etc/services文件:配置服务
get***byname
gethostbyname
getprotobyname
2.TCP/UDP编程
对等模型:AF_INETSOCK_DGRAM 0:UDP
C/S模型: AF_INET SOCK_STREAM 0:TCP
2.0网络编程
ISO模型7层模型 4层
物理层
数据链路层 数据链路层 (传输的物理怎么传输)
网络层 IP层 (数据的传输方式)
传输层 传输层 (数据传输的结果)
会话层
表示层
应用层 应用层 (数据传递的含义)
2.1UDP编程的数据特点
UDP采用对等模拟高兴SOCK_DGRAM
socket socket:socket
绑定IP地址:bind 连接目标(可选): connetct
read/recv/recvfrom 发送数据:write/send/sendto
关闭:close
案例:
A: B:
接收用户的数据 发送数据
打印数据与发送者IP 接收数据
返发送一个信息 打印
总结:
1.问题:
connect+ send +close== sendto ?
2.问题:
recvfrom的作用不是从专门指定IP接收,而是从任意IP接收数据,返回发送数据者的IP
3.问题:
为什么要bind,bind主要目的:告诉网络发送数据的目标
是否一定绑定才能发送数据?
否!只要知道你的IP与PORT,就能发送数据。
4.问题:
为什么发送者没有绑定IP与端口,他也有端口呢?
底层网络驱动,帮我们自动生成IP与端口
5.缺陷:
接收方不区分发送者。
send函数
sendto函数
intsendto(
intfd, //socket描述符
constvoid *buf, //发送的数据缓冲
size_tsize, //要发送的数据长度
intflags, //发送方式 MSG_NOWAIT MSG_OOB
conststruct sockaddr *addr, //发送的目标与端口
socklen_tlen); //sockaddr_in的长度
返回值:
-1:发送失败
>=0:发送的数据长度
recv函数
recvfrom函数
intrecvfrom(
intfd,
void*buf,
size_tsize,
intflags,
structsockaddr* addr, //返回发送这IP与端口
socklen_t*len); //输入返回IP的缓冲的大小
2.2TCP编程的数据特点
2.3TCP服务器的编程
3.TCP的服务器编程模式
4.IP协议与处理(SOCK_RAW,SOCK_PACKET)
5.pcap编程
6.HTTP协议与网页搜索
作业:
1.重新编写UDP网络通信
2.使用gethostbyname的得到baidu.com