网络编程之 广播 组播 域内套接字

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的域内套接字实现,两个父子进程间的信息通信
父进程获取用户输入,子进程表明身份并打印获取的信息。
















 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘十彡

IT发展快就是因为有开源精神

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值