1、网络编程之 广播 组播 域内套接字
2、网络编程之 协议分析
1、广播=====》基于UDP协议形式的消息发送
特点:
必须要发送广播地址 ===》局域网中的网段最大地址
必须要设置允许发送广播 ====》出现广播风暴
2、框架流程:
发送端:
socket()===>setsockopt()==》sendto()==close()
int setsockopt(int sockfd, int level, int optname,
const void *optval, socklen_t optlen);
功能:通过该函数可以修改指定套接字的属性。
参数:sockfd 要修改属性的套接字id
level 协议类型 ===》SOL_SOCKET 通用套接字类型
==》IPPROTO_TCP
==》IPPROTO_UDP
==》IPPROTO_IP
optname 套接字的控制方式:
SO_REUSEADDR 地址重用
SO_BROADCAST 允许广播
optval 属性的设置值 1 表示生效 0 无效
optlen 属性值的长度。
返回值:成功 0
失败 -1
注意事项:发送端在发送数据的时候目标主机的地址
和端口应该是广播地址。
(192.168.1.255)
sendto();的目标地址应该是广播地址(192.168.1.255)。
接收端:
socket()===>bind()===>recvfrom()====》close()
1、socket 应该是UDP 协议类型
2、bind 应该是bind到广播地址和广播端口
sockaddr_int baddr.
baddr.sin_port = 5555;
badd.sin_addr = 192.168.1.255;
bind(sockfd, ()baddr);
4、recvfron 直接从bind的地址上获取数据,
并打印输出,可以不关系信息的发送者。
5、关闭本次接收数据。
3、组播 =====》小范围内的广播 ===》多播
组播有固定的IP地址范围,属于IP地址划分中的D类网络。
范围:224.0.0.1 ---》239.255.255.255 该类地址没有掩码。
一个ip地址表示一个固定的组播范围。
业内约定:
1、局部地址
224.0.0.1 -- 224.0.0.255
2、预留地址
244.0.1.0 -- 238.255.255.255
3、管理地址
239.0.0.0 -- 239.255.255.255
常用组播地址:
224.0.0.1 ===》所有支持组播的主机。
224.0.0.2 ===》所有支持组播的路由器。
224.0.0.5 ====》OSPF 路由器
224.0.0.9 ====》RIP 路由器
组播的框架流程:
发送端: socket() ===>sendto()===》close()
注意:sendto 的目标主机是组播地址。
接收端: socket()==>加入组播地址===>bind()===>recvfrom()==>close()
加入组播:
1、定义组播结构体
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr("224.0.0.100");
mreq.imr_interface.s_addr = inet_addr("192.168.1.100");
2、修改属性加入组播
setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,szieof(mreq));
3、bind组播地址
struct sockaddr_in baddr;
baddr.sin_port = 4444;
baddr.sin_addr.s_addr = 224.0.0.100;
4、recvfrom
-===========================================================
域内套接字 ===》socket 的单机进程间通信
1、头文件 sys/un.h
2、操作过程同独立主机的通信过程。
2.1 socket()有变化需要调整其协议族
socket(PF_INET,SOCK_STREAM,0);====>PF_INET 互联网程序
socket(PF_UNIX,SOCK_STREAM,0);====>PF_UNIX 域内套接字
代表用于单机间进程通信。
PF_UNIX == AF_UNIX = PF_LOCAL
2.2 bind()的时候地址有变化
struct sockaddr_in seradrr;
bind(sockfd,(struct sockaddr*)&seraddr;);===>互联网地址信息
struct sockaddr_un seraddr;
seraddr.sun_family = PF_UNIX; ///域内套接字
strcpy(seraddr.sun_path, "./socket"); ///套接字文件路径+名称
bind(sockfd,(struct sockaddr*)&seraddr,);
2.3 所有的域内套接字通信过程完全类似互联网程序框架:
server: socket()==>bind()==>listen()==accpet()==>recv==>close()
client: seocket()==>connect()==>send==>close()
练习:
使用域内套接字的方式,完成两个进程间的文件传送。
基于UDP的域内套接字:
1、结构体和函数操作类似与TCP 的过程
2、操作流程完全符合UDP的操作过程。
server: socket()==>bind()===>recvfrom()===>close()
client: socket()==>sendto()==>close();
===================================================
协议分析 ===》《TCP/IP 详解 卷一》;
从底层协议向上分析:
1、物理链路层 ===》以太网V2协议
协议头部长度:14+4 字节;
14字节:6字节的目的MAC
6字节的源MAC
2字节的上层协议类型 ==》14字节
4字节:尾部的CRC校验位。
2、网络层===》IP层,默认是20字节
第一字节:前4bit位表示当前网络协议版本,4 ipv4 6 ipv6
后4bit位表示当前协议头总长度,5 = 4*5 = 20 字节
第二字节:TOS 服务类型
TOS(3bit 优先级,4bit(最大吞吐 最小延迟 高可靠性 最小费用),1暂时未用);
第三 、四字节:表示当前协议支持的最大数据容量。65535 字节
一般情况是1500 字节。 ===》MTU 最大传输控制单元
第五、六字节:编码格式
第七字节:
前3bit位:控制方式:0x40 不分片 0x20 滑动窗口
第七字节:
后5bit位+第八字节: 片内偏移量
第九字节: TTL 生存时间 unix 255
linux 64
windows 128
第十字节: 上层协议的类型
0x06 TCP 0x11 UDP
第十一 十二字节: TCP 协议校验位:
第十三、十四 十五 十六 的四字节源ip地址
第十七、十八 十九 二十 的四字节目的ip地址
作业:
用UDP的域内套接字实现,两个父子进程间的信息通信
父进程获取用户输入,子进程表明身份并打印获取的信息。
网络编程之 广播 组播 域内套接字
最新推荐文章于 2022-09-04 18:10:36 发布