好玩的网络编程小程序之组播

学习网络编程最大的乐趣就是能够实现跨主机的交流,不得不说,在开始实现这个功能的时候的确能够带来非常之多的成就感。那么怎么才能够实现这种功能呢?今天就给大家带来一个非常不错的方式,组播!

在使用组播的时候,我们需要先了解一下目前的IP地址。目前IPv4主要分为以下几类

PV4地址分类
(适用于大型网络)A类:(以0开头)
                1个字节的网络地址 ,3个字节的主机地址
网络二进制:0000 0000 0000 0000 0000 0000 0000 0001   - 0111 1111 1111 1111 1111 1111 1111 1110
点分十进制:            0.0.0.1            --    127.255.255.254
    注意:IP中有两个地址不能用:
        地址全为0的  :网络ID号
        地址全为1的  :广播地址
(适用于中型网络)  B类:(以10开头)
2个字节的网络地址,2个字节的主机地址 
网络二进制:1000 0000 0000 0000 0000 0000 0000 0001   - 1011 1111 1111 1111 1111 1111 1111 1110
点分十进制:            128.0.0.1            --    191.255.255.254
(适用于小型网络)  C类:(以110开头)
                3个字节的网络地址,1个字节的主机地址
网络二进制:1100 0000 0000 0000 0000 0000 0000 0001   - 1101 1111 1111 1111 1111 1111 1111 1110
点分十进制:            192.0.0.1    

(组播地址)  D类:(以1110开头)
                4个字节的网络地址,0个字节的主机地址
网络二进制:1110 0000 0000 0000 0000 0000 0000 0001   - 1110 1111 1111 1111 1111 1111 1111 1110
点分十进制:            224.0.0.1            --    239.255.255.254    
(保留地址)  E类:(以11110开头)

从这里可以得知,组播的地址为224.0.0.1        ~        239.255.255.254

知道IP地址之后,下面就是实操部分了。

实操分为两部分,分别是发送部分和接受部分

        发送部分                        接受部分

        声明套接字                        声明套接字        

        允许发送广播                    绑定组播地址

        声明组播地址                     将自己IP加入到组播组中

       往组播地址发送信息             接受信息

组播采用的是报文的方式进行传输,所以在创建管街字的时候需要注意创建报名式的管接字。

先进行发送部分

第一步,声明套接字,主要使用的函数是socket,函数原型如下

#include

#include

int socket(int domain, int type, int protocol);

功能: 创建一个具有网络属性的文件描述符 产生socket套接字

参数:
domain:地址族:

    AF_UNIX, AF_LOCAL 本地连接协议

    AF_INET IPv4

    AF_INET6 IPv6

type:协议:

    SOCK_STREAM 流式套接字 --- TCP协议

    SOCK_DGRAM 数据报文套接字 --- UDP协议

    SOCK_RAW 原始套接字 --- 不需要任何协议 ---不安全

    protocol:参数生效值

默认为0 --- 代表前两个参数生效

返回值:

成功返回套接字文件描述符

失败返回-1,并设置错误码

创建套接字之后,要注意先允许发送组播。格式如下

 

声明组播,具体操作如下。

这里需要注意,因为sockaddr自带的结构体不太实用,所以采用struct sockaddr_in 结构体来替代。这个结构体的参数第一个是地址族,第二个是端口号,第三个是IP地址,

 声明之后,就能够调用发送函数了sendto了,这个函数的参数第一个是sockfd,第二个是存储数据的数组,第三个数据是数组长度,第四个参数为0,表示可阻塞,第五个参数是替换的结构体,因为替换过了,所以需要进行强转操作。第六个参数是addr的长度

 做到这里,整个发送端就结束了。

接受端

接收端创建套接字是一样的步骤,所以不做赘述。

创建套接字之后,就需要进行绑定了。这时候需要使用的是bind函数。使用这个函数的时候需要注意,它自己自带的结构体不适用,但是有一个可替代的结构体。

#include /* See NOTES */

#include

int bind(int sockfd, const struct sockaddr *addr,

socklen_t addrlen);

功能:给sockfd绑定IP和端口号

参数:

sockfd

addr:结构体指针,是需要用来赋值的

addrlen:addr的长度

返回值:

    成功返回0

    失败返回-1,并设置错误码

 即上面这个结构体,第一个参数为地址族,第二个参数为端口号,第三个参数为组播的IP地址。

 使用的时候需要注意,因为是使用的替代结构体,所以传参的时候需要进行强转。具体操作如上。

接下来就是最难的一部分,将其加入组播中,这个时候就需要调用setsockopt

#include <sys/types.h>          /* See NOTES */
            #include <sys/socket.h>
       
       int setsockopt(int sockfd, int level, int optname,//设置套接字的属性
                      const void *optval, socklen_t optlen);
            功能: 
                    设置sockfd的属性 
                    
            参数: 
                    sockfd 

                    level:等级 
                    
                    optname:选项 
                    
                    optval:选项取值 
                    
                    optlen:值的长度

该函数的第四个值是一个结构体,所以使用的时候需要调用结构体,即如下操作

 

作为之后,就是发送操作了,这个发送操作需要调用recvform函数,这个函数需要注意,最后一个参数的值是一个指针类型,所以需要取地址。但是其他参数基本和sendto一致。

 昨晚之后就能够实现通信了。

具体操作如下:一边发送,一边能够实现接受

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值