网络是否支持组播功能?
-
我编译好的组播功能程序在板子上不能正常运行,板子网络是否支持组播功能?如果不支持,是否可以开启此功能?具体步骤如何操作?谢谢
你好,我测试结果是可以的,网卡支持组播功能
我的测试场景是在局域网下,设置了组播IP地址239.0.0.10进行测试,以PC为服务端发送数据,开发板用作客户端接收数据。结果可以进行数据传输。以下是服务端的测试代码:
这是客户端的测试代码:
将代码编译完成后,分别在PC端和开发板运行即可验证
Code: Select all
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
int main() {
// 1.创建一个通信的socket
int fd = socket(PF_INET, SOCK_DGRAM, 0);
if(fd == -1) {
perror("socket");
exit(-1);
}
// 2.设置多播的属性,设置外出接口
struct in_addr imr_multiaddr;
// 初始化多播地址
inet_pton(AF_INET, "239.0.0.10", &imr_multiaddr.s_addr);
setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, &imr_multiaddr, sizeof(imr_multiaddr));
// 3.初始化客户端的地址信息,在多播中需要表明客户端的信息
struct sockaddr_in cliaddr;
cliaddr.sin_family = AF_INET;
cliaddr.sin_port = htons(9999);
inet_pton(AF_INET, "239.0.0.10", &cliaddr.sin_addr.s_addr);
// 3.通信
int num = 0;
while(1) {
char sendBuf[128];
sprintf(sendBuf, "testdata_%d\n", num++);
// 发送数据
sendto(fd, sendBuf, strlen(sendBuf) + 1, 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
printf("组播的数据:%s\n", sendBuf);
sleep(1);
}
close(fd);
return 0;
}
Code: Select all
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
int main() {
// 1. 创建一个 socket
int fd = socket(PF_INET, SOCK_DGRAM, 0);
if (fd == -1) {
perror("socket");
exit(-1);
}
// 2. 设置接收组播的属性
struct ip_mreq mreq;
inet_pton(AF_INET, "239.0.0.10", &mreq.imr_multiaddr.s_addr);
mreq.imr_interface.s_addr = htonl(INADDR_ANY); // 接收来自任意接口的组播
// 加入组播组
if (setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {
perror("setsockopt");
exit(-1);
}
// 3. 绑定到一个端口
struct sockaddr_in localaddr;
memset(&localaddr, 0, sizeof(localaddr));
localaddr.sin_family = AF_INET;
localaddr.sin_port = htons(9999); // 绑定端口
localaddr.sin_addr.s_addr = htonl(INADDR_ANY); // 绑定到任意地址
if (bind(fd, (struct sockaddr *)&localaddr, sizeof(localaddr)) < 0) {
perror("bind");
exit(-1);
}
// 4. 接收数据
while (1) {
char recvBuf[128];
struct sockaddr_in srcaddr;
socklen_t addrlen = sizeof(srcaddr);
// 接收数据
ssize_t n = recvfrom(fd, recvBuf, sizeof(recvBuf) - 1, 0, (struct sockaddr *)&srcaddr, &addrlen);
if (n < 0) {
perror("recvfrom");
exit(-1);
}
recvBuf[n] = '\0'; // 添加字符串结束符
printf("%s\n", recvBuf);
}
close(fd);
return 0;
}