【Linux网络编程】广播、组播与本地网络通信

来源:互联网 发布:淘宝限时折扣 编辑:程序博客网 时间:2024/05/22 14:11

广播

广播实现的是1对多的情况,有一个发送端多个接收端

【注意】
1、广播只能在局域网中转发,默认的路由器一般不支持数据在外网转发。
2、采用的是UDP协议

发送端编程流程

1、设置通信标准

2、设置网络信息结构体
【注意】 要制定广播地址(不能是自己的IP地址)

3、设置套接字属性,具有广播功能,在使用setsockopt时,第四个参数指定整形数据,并且是非0值,才会有效,如果为0,则无效。

4、发送数据

接收端编程流程

1、设置通信标准

2、绑定网络信息结构体
【注意】要指定广播地址,从那个广播地址中接收数据(不能是自己的IP地址)

3、接收数据

组播

实现的是1对多的情况,有一个发送端多个接收端,并且接收端属于同一个组。

它的要求:
发送方首先要把数据发送到组播地址当中去,然后接收方从从组播地址当中接收数据并且接收方要加入到组播地址当中去。

D类地址(组播地址)
不分网络地址和主机地址,第1字节的前4位固定为1110
224.0.0.1 – 239.255.255.255

对于组播地址,一般使用224.10.10.10~224.255.255.255的地址范围

  • IPv4 multicast request. */
    将本进程加入多播组,从而让路由器在收到多播数据包时转发给本进程所在的主机。
struct ip_mreq{     /* IP multicast address of group. 多播地址 */     struct in_addr imr_multiaddr;                //成员.s_addr      /* Local IP address of interface.  本地IP地址*/     struct in_addr imr_interface;                //成员.s_addr};

setsockopt设置套接字选项,将本地地址加入到组播地址当中去。如果不想接收数据,可以从组播地址当中移除掉。

IPPROTO_IP 网络层
#define IP_ADD_MEMBERSHIP 35 –> 代表添加成员
#define IP_DROP_MEMBERSHIP 36 –> 代表移除成员

发送端编程流程

1、设置通信标准socket

2、设置网络信息结构体,定义struct sockaddr_in,并将IP地址设置为组播地址

3、发送数据

接收端

1、设置通信标准

2、定义struct sockaddr_in,绑定网络信息结构体。
【注意】必须将IP地址设置为 INADDR_ANY ,因为组播数据包的目的IP地址不确定,是由IP地址与MAC地址组合而来,因此接收端必须有能力接收来自任何IP地址的数据包。

3、将接收方添加组播地址中,从而路由器可以将收到的组播数据包分发给组内的所有主机。

struct ip_mreq:组播地址和本地IP地址。
【注意】如果你只有一个网卡,本地IP地址可以填写 INADDR_ANY,即从默认的网口接收组播数据包,如果你有不止一块网卡,并且它们连接了不同的网络,你必须指定某个网卡的IP地址,从那个网络接口接收组播数据包。

setsockopt完成设置操作。

4、接收数据

组播实现代码

本地网络通信

struct sockaddr_un // <sys/un.h>{        sa_family_t sun_family;    //通信范围  本地通信  AF_UNIX或者AF_LOCAL,也可以是 PF_UNIX或者PF_LOCAL        char sun_path[108]; // 在当前目录下创建的文件,自己定义。};

TCP编程流程

服务器端

1、设置通信标准(socket)
2、绑定文件名字,已让其他客户端通过文件名字找到服务器(bind)
3、设置监听数目(listen)
4、处理客户连接操作(accept)
5、收发数据(recv,send)

客户端

1、设置通信标准(socket)
2、连接文件名字,通过文件名字找到服务器(connect)
3、收发数据(recv,send)

UDP编程流程

服务器端

1、设置通信标准(socket)
2、绑定文件名字,已让其他客户端通过文件名字找到服务器(bind)
3、收发数据(recvfrom,sendto)

客户端

1、设置通信标准(socket)
2、收发数据(recvfrom,sendto)

0 0
原创粉丝点击