实现将本地IP加入指定组播IP中
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main()
{
// 1.创建UDP通信对象
int udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
// 2.绑定
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8888);
server_addr.sin_addr.s_addr = INADDR_ANY;
int ret = bind(udp_socket, (struct sockaddr *)&server_addr, sizeof(server_addr));
if (ret < 0)
{
perror("绑定失败\n");
return -1;
}
/*
struct ip_mreq
{
struct in_addr imr_multiaddr; //组播的IP地址
struct in_addr imr_interface; //需要加入组播的IP地址
}
*/
// 3.加入组播
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr("224.10.10.10"); // 设置一个组播地址
mreq.imr_interface.s_addr = INADDR_ANY; // 把本地所有网卡加入组播地址
// 开启组播功能
ret = setsockopt(udp_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
if (ret < 0)
{
perror("加入组播失败\n");
return -1;
}
else
{
printf("加入组播成功\n");
}
// 开始接收组播数据
while (1)
{
char buf[1024] = {0};
int len = recvfrom(udp_socket, buf, sizeof(buf), 0, NULL, NULL);
printf("len=%d,buf=%s\n", len, buf);
}
}
如有不懂请往主页查看相应API