//接收端
#include <stdio.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <ifaddrs.h>
#include <netdb.h>
int main(int argc,char** argv)
{
//1.创建套接字
int sock_fd = socket(AF_INET,SOCK_DGRAM,0);
//2.设置套接字的属性
//定义组播地址结构体,给组播地址成员赋值,给本机地址成员赋值
struct ip_mreq zubo;
zubo.imr_multiaddr.s_addr = inet_addr("224.10.10.15");//224.0.0.0-----238.255.255.255
zubo.imr_interface.s_addr = INADDR_ANY;
struct ifaddrs *ifaddr, *ifa;
char host[NI_MAXHOST];
if (getifaddrs(&ifaddr) == -1) {
perror("getifaddrs");
exit(EXIT_FAILURE);
}
/* 遍历链表并打印每个接口的IP地址
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa->ifa_addr == NULL)
continue;
if (ifa->ifa_addr->sa_family == AF_INET) { // 检查是否为IPv4地址
struct sockaddr_in *sin = (struct sockaddr_in *)ifa->ifa_addr;
// 使用inet_ntoa将IP地址转换为点分十进制格式的字符串(注意:inet_ntoa不是线程安全的)
// 或者,更推荐使用getnameinfo,它是线程安全的
// 但为了简单起见,这里我们使用inet_ntoa
printf("%s IP Address: %s\n", ifa->ifa_name, inet_ntoa(sin->sin_addr));
// 如果你想要使用getnameinfo(推荐用于多线程程序),可以这样做:
// memset(host, 0, NI_MAXHOST);
// if (getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in),
// host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) == 0) {
// printf("%s IP Address: %s\n", ifa->ifa_name, host);
// }
}
}
*/
socklen_t zubo_len = sizeof(zubo);
setsockopt(sock_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &zubo, zubo_len);
//绑定
struct sockaddr_in local;
local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY; // 监听所有本地地址
local.sin_port = htons(atoi(argv[1])); // 选择一个本地端口
bind(sock_fd, (struct sockaddr *)&local, sizeof(local));
char *buf = malloc(100);
struct sockaddr_in from_addr;
socklen_t from_len = sizeof(from_addr);
while(1)
{
memset(buf,0,100);
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa->ifa_addr == NULL)
continue;
if (ifa->ifa_addr->sa_family == AF_INET) { // 检查是否为IPv4地址
struct sockaddr_in *sin = (struct sockaddr_in *)ifa->ifa_addr;
// 使用inet_ntoa将IP地址转换为点分十进制格式的字符串(注意:inet_ntoa不是线程安全的)
// 或者,更推荐使用getnameinfo,它是线程安全的
// 但为了简单起见,这里我们使用inet_ntoa
printf("%s IP Address: %s\n", ifa->ifa_name, inet_ntoa(sin->sin_addr));
// 如果你想要使用getnameinfo(推荐用于多线程程序),可以这样做:
// memset(host, 0, NI_MAXHOST);
// if (getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in),
// host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) == 0) {
// printf("%s IP Address: %s\n", ifa->ifa_name, host);
// }
}
}
recvfrom(sock_fd,buf,100,0,(struct sockaddr *)&from_addr,&from_len);
printf("from multi:%s\n",buf);
}
}
//发送端
#include <stdio.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <ifaddrs.h>
#include <netdb.h>
int main(int argc,char **argv)
{
//1.创建套接字
int sock_fd = socket(AF_INET,SOCK_DGRAM,0);
//2.设置套接字的属性
struct sockaddr_in zubo;
zubo.sin_family = AF_INET;
zubo.sin_port = htons(atoi(argv[1]));
zubo.sin_addr.s_addr = inet_addr("224.10.10.15");
struct ifaddrs *ifaddr, *ifa;
char host[NI_MAXHOST];
if (getifaddrs(&ifaddr) == -1) {
perror("getifaddrs");
exit(EXIT_FAILURE);
}
/* 遍历链表并打印每个接口的IP地址
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa->ifa_addr == NULL)
continue;
if (ifa->ifa_addr->sa_family == AF_INET) { // 检查是否为IPv4地址
struct sockaddr_in *sin = (struct sockaddr_in *)ifa->ifa_addr;
// 使用inet_ntoa将IP地址转换为点分十进制格式的字符串(注意:inet_ntoa不是线程安全的)
// 或者,更推荐使用getnameinfo,它是线程安全的
// 但为了简单起见,这里我们使用inet_ntoa
printf("%s IP Address: %s\n", ifa->ifa_name, inet_ntoa(sin->sin_addr));
// 如果你想要使用getnameinfo(推荐用于多线程程序),可以这样做:
// memset(host, 0, NI_MAXHOST);
// if (getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in),
// host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) == 0) {
// printf("%s IP Address: %s\n", ifa->ifa_name, host);
// }
}
}
*/
socklen_t zubo_len = sizeof(zubo);
bind(sock_fd,(struct sockaddr *)&zubo,zubo_len);
//向组播地址发送消息
char *buf = malloc(100);
while(1)
{
memset(buf,0,100);
fgets(buf,100,stdin);
sendto(sock_fd,buf,100,0,(struct sockaddr *)&zubo,zubo_len);
}
}