高级编程之网络编程(四)

 

广播 组播

广播 ===》只能用UDP协议形式发送数据 ===》不要求客户端一定在线。

特点: 必须要发送的广播地址 ===》局域网中的最大地址。
    必须要设置广播端程序的套接字属性允许发送广播。

流程:

发送端:
 sokcet()===>setsockopt() ===>sendto() ===>close()
  
 1、setsockopt() ====>允许发送广播
  
 原型:int setsockopt(int sockfd, int level, int optname,
                       const void *optval, socklen_t optlen);
 功能:通过该函数可以设置指定的sockfd 套接字的属性。
 参数:sockfd要操作的套接字id
    level 套接字的协议类型
      SOL_SOCKET    通用套接字
    IPPROTO_IP    IP 协议
    IPPROTO_TCP   TCP协议
    IPPROTO_UDP   udp协议
   optname 套接字的控制方式:
    SO_REUSEADDR   ===>地址重用
   SO_BROADCAST   ===>允许广播
   SO_RCVTIMEO    ===>接收数据超时
   SO_SNDTIMEO    ===>发送数据超时
   optval  设置属性实际值
   optlen  属性设置的长度
  返回值:成功 0  失败-1


  2、发送数据的目标不再是具体的主机,而是广播地址。
  
  sockaddr_in  bro_addr;
  bro_addr.sin_family   = PF_INET;
  bro_addr.sin_port   = htons(6666);
  bro_addr.sin_addr.s_addr = inet_addr("192.168.0.255");


接收端:
 socket()==>bind()===>recvfrom()===>close()

 注意:bind() 的地址应该是bind到本地的广播地址+广播端口上。

 

缺点:
 1、可能造成广播风暴
 2、范围过大导致发送的消息不受控。


组播 ==》多播 ===》小范围广播


组播占用ip地址划分的D类网络地址:224.0.0.1 ---239.255.255.255

 大致对以上地址有如下约定:
 1、局部地址
   224.0.0.1 -- 224.0.0.255
 2、预留地址
   224.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 路由器
  224.0.0.18  ===》VRRP 协议组播地址

组播发送和接受:

发送端:
 socket()===>sendto() ===>close()

 注意:sendto的目标必须是组播地址+组播端口

接收端:
 socket()===>加入多播组 ==>bind===》recvfrom ===》close
 注意:bind 必须是组播地址+组播端口
 加入多播组:
 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.0.100");
 2、修改属性加入多播
   setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq));
 3、bind组播地址
    struct sockaddr_in  myaddr;
    myaddr.sin_family   = PF_INET;
    myaddr.sin_port   = htons(5555);
    myaddr.sin_addr.s_addr = inet_addr("224.0.0.100");
    bind(sockfd,(struct sockaddr*)&myaddr,sizeof(myaddr));
 4、recvfrom().....

=============================================================================
域内套接字  ===》socket 单机进程间通信

0、头文件:  sys/un.h

1、TCP

 1.1 socket()的第一个参数由:PF_INET  该为: PF_UNIX/PF_LOCAL
 1.2 sockaddr_in 类型调整为  sockaddr_un
  struct sockaddr_un
  {
   sa_family_t  sun_family;    协议族
   char    sun_path[108]; socket套接子的文件路径+名称
  };
 1.3 操作流程 完全类似网络程序。
  客户端:socket===>connect==>send/recv ===>close
  服务器端:socket==>bind===>listen===>accept===>recv/send ==>close

 以上通信过程会在文件系统中生成一个套接字文件,所有的域内通信都是
 基于该文件传送。

练习:
 用以上套接字方式完成两个父子进程见的通信,并找出套接字文件的创建函数。

注意:套接字文件是由服务器端的bind函数创建。
   客户端必须在服务器端启动之后才能链接。
   如果多次启动必须要在bind之前卸载文件。 unlink(xxx);


2、UDP

 1、socket() 的参数1 需要调整为: AF_UNIX  PF_LOCAL
       2              SOCK_DGRAM
 
  

 2、UDP的服务器端和客户端:
 
  bind函数以及sendto函数的参数addr都需要调整为域内套接字。

  struct sockaddr_un;


  服务器: socket==>bind ===>recvfrom==>close
  客户端: socket==>sendto===>close

 

练习:选取任意一种域内套接字方式完成,进程1 给进程2 发送文件
   并将文件内容打印输出到屏幕。


grep -r  'abc'  ./
递归查找当前路径下文件中包含abc字符的所有文件并列出文件名称

vim 的替换:

:g/s1/s//s2/g 
将当前文件中所有的s1字符串替换为s2

===============================================================
协议分析  ===> 《TCP/IP 详解 卷一》
    协议分析网


从下层的物理链路层 ===》上层的传输层协议组成。

数据包长度: 46  --  1500  字节
46:最小报文长度
1500 MTU 最大传输控制单元

所有的数据包中在TCP/IP协议中都有各自的头部数据。

物理链路层:以太网头部 ===》14+4 字节构成。
 
 前14字节的头部信息
  前6字节: 目的MAC
  中6字节:  源MAC
  后2字节: 向上一层协议的类型
     0x0800  IP协议
     0x0806  ARP协议

   
 后4字节的尾部校验位;

网络层:====》RFC 791===》默认长度20字节

 第1字节:前4bit位表示的是当前网络协议版本:
    如果是4 表示IPV4
    如果是6 表示IPV6
    后4bit位 表示的是当前层协议的数据
    长度,以4字节为单位。4*5 =20字节
 第二字节:TOS 服务类型
  TOS(3bit  优先级,4bit (最大吞吐 最小延迟 最高可靠性 最小费用),1bit扩展未用)

 第三 、四字节:两个字节表示当前协议最大数据容量:65536 字节
 第五、六 字节:编码格式
 第七字节:前3bit   0x80 0x00  不用
        0x40  不分片
        0x20  滑动窗口
 第七字节:后5bit+第八字节: 片内偏移量。

 第九字节:生存时间  unix 255  liunx 64  windows 128
 第十字节:向上一层协议的类型: 0x11 udp  0x06  tcp
 第十一 十二 字节:TCP协议头部校验位。

 第十三。。十六字节: 源ip地址
 第十七. . 二十字节: 目的ip地址

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值