网络编程小程序之组播"/>
好玩的网络编程小程序之组播
学习网络编程最大的乐趣就是能够实现跨主机的交流,不得不说,在开始实现这个功能的时候的确能够带来非常之多的成就感。那么怎么才能够实现这种功能呢?今天就给大家带来一个非常不错的方式,组播!
在使用组播的时候,我们需要先了解一下目前的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#includeint socket(int domain, int type, int protocol);功能: 创建一个具有网络属性的文件描述符 产生socket套接字参数:
domain:地址族:AF_UNIX, AF_LOCAL 本地连接协议AF_INET IPv4AF_INET6 IPv6type:协议:SOCK_STREAM 流式套接字 --- TCP协议SOCK_DGRAM 数据报文套接字 --- UDP协议SOCK_RAW 原始套接字 --- 不需要任何协议 ---不安全protocol:参数生效值默认为0 --- 代表前两个参数生效返回值:成功返回套接字文件描述符失败返回-1,并设置错误码
创建套接字之后,要注意先允许发送组播。格式如下
声明组播,具体操作如下。
这里需要注意,因为sockaddr自带的结构体不太实用,所以采用struct sockaddr_in 结构体来替代。这个结构体的参数第一个是地址族,第二个是端口号,第三个是IP地址,
声明之后,就能够调用发送函数了sendto了,这个函数的参数第一个是sockfd,第二个是存储数据的数组,第三个数据是数组长度,第四个参数为0,表示可阻塞,第五个参数是替换的结构体,因为替换过了,所以需要进行强转操作。第六个参数是addr的长度
做到这里,整个发送端就结束了。
接受端
接收端创建套接字是一样的步骤,所以不做赘述。
创建套接字之后,就需要进行绑定了。这时候需要使用的是bind函数。使用这个函数的时候需要注意,它自己自带的结构体不适用,但是有一个可替代的结构体。
#include /* See NOTES */#includeint bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);功能:给sockfd绑定IP和端口号参数:sockfdaddr:结构体指针,是需要用来赋值的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一致。
昨晚之后就能够实现通信了。
具体操作如下:一边发送,一边能够实现接受
更多推荐
好玩的网络编程小程序之组播
发布评论