目录
1、单播 / 广播 / 组播 的概念
(1) 单播
(2) 广播
(3) 多播(组播)
2、广播 socket编程(只能是UDP通信)
3、多播 socket编程(只能是UDP通信)
1、单播 / 广播 / 组播 的概念
(1) 单播
之前在进行UDP和TCP编程的时候,客户端把数据发送到指定IP地址,此时接收方只有一个,这种数据包发送方式称为“单播”。
(2) 广播
如果是把数据发送某个局域网中的所有主机,这种数据包的发送方式称为“广播”
- 发送出去的数据会被 广播地址所在网段的所有主机接收
-
每个局域网的最大主机地址代表该网段的广播地址。
- 以192.168.1.0 (255.255.255.0) 网段为例,192.168.1.255代表该网段的广播地址
-
255.255.255.255 在所有网段中都代表广播地址。
- 如果主机A向 255.255.255.255 发数据,那么当前局域网里的所有主机都会收到数据。
(3) 多播(组播)
如果是把数据发送给某个局域网中的一组IP地址,这种发送方式称为“多播”,这个组称为“多播组”,只有加入多播组的主机才能收到数据。
- 广播是发给某一局域网中的所有主机。过多的广播会大量占用网络带宽,造成广播风暴,影响正常的通信。
- 多播是一种折中的方式,既能发送给多个主机,又能避免象广播那样带来过多的负载
2、广播 socket编程(只能是UDP通信)
广播socket编程的侧重点在发送方(客户端),而且只有使用UDP协议才能广播。接收方的代码可以沿用单播的代码。发送方的数据发送步骤如下:文章来源:https://www.toymoban.com/news/detail-428352.html
- 创建用户数据报套接字
- 套接字默认不允许广播数据包(因为可能引发广播风暴),需要使用 setsockopt设置属性
- 目标地址(接收方地址) 指定为广播地址
- 指定目标端口
- 发送数据包
#define DST_PORT 9090
/* 1. 创建socket fd */
if ((fd = socket (AF_INET, SOCK_DGRAM, 0)) < 0) { //UDP编程
perror ("socket");
exit (1);
}
/* 2. 允许广播设置 */
int b_br = 1;
setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &b_br, sizeof(int));
/*3. 指定目标IP和端口号填充 */
struct sockaddr_in sin;
memset(&sin, 0, sizeof(sin))
sin.sin_family = AF_INET;
sin.sin_port = htons (SERV_PORT); //网络字节序的端口号
sin.sin_addr.s_addr = inet_addr("192.168.11.255"); // 广播地址
/*4. 发送数据 */
char buf[128] = {'1','2','3','4','5','6','\0'};
sendto (fd, buf, strlen(buf), 0, (struct sockaddr *)&sin, sizeof(sin));
3、多播 socket编程(只能是UDP通信)
多播socket编程的侧重点在接收方(服务端),接收方要创建一个多播组(类似于QQ群),然后把当前套接字加入到多播组中;而发送方发送数据的目标地址不是服务端的IP地址,而是多播组的IP地址。文章来源地址https://www.toymoban.com/news/detail-428352.html
- 创建数据报套接字
- 绑定IP地址和端口号
- 创建多播组(类似于创建QQ群)
- 将当前套接字加入到多播组(类似于加群)
- 接收数据
#define SERV_PORT 9090
#define MULTICAST_IP "192.168.11.170"
#define BUFSIZE 128
int fd = -1;
/* 1. 创建socket fd */
if ((fd = socket (AF_INET, SOCK_DGRAM, 0)) < 0) { //udp程序
perror ("socket");
exit (1);
}
/* 2. 绑定IP地址和端口号 */
struct sockaddr_in sin;
memset(&sin, 0, sizeof(sin))
sin.sin_family = AF_INET;
sin.sin_port = htons(SERV_PORT); // 网络字节序的端口号
sin.sin_addr.s_addr = htonl(INADDR_ANY); // 服务端可以绑定任意IP
if (bind (fd, (struct sockaddr *) &sin, sizeof (sin)) < 0) {
perror ("bind");
exit (1);
}
/* 3. 创建多播组,初始化多播组结构体 */
struct ip_mreq mreq;
memset(&mreq, 0, sizeof(mreq))
mreq.imr_multiaddr.s_addr = inet_addr(MULTICAST_IP);
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
/* 4. 把当前套接字加入到多播组 */
setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
/* 5. 接收数据 */
char buf[BUFSIZE ];
struct sockaddr_in cin;
socklen_t addrlen = sizeof(cin);
recvfrom (fd, buf, BUFSIZE - 1, 0, (struct sockaddr *)&cin, &addrlen);
到了这里,关于广播、组播 socket编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!