/**************************************************************************************************************************************
*
* file name:multicast.c
* author :momolyl@126.com
* date :2024/06/04
* brief :小组实现,小组中的每位成员都需要设计程序,要求程序可以加入到一个多播组中并等待服务器发送数据包,
* 并且程序还需要具有发送功能,如果收到数据包则把消息内容输出到终端,
* 消息内容格式 [消息来源IP 消息时间 ] : 消息内容
* note :运行多播可执行文件 ./multicast 服务器端口 多播组地址
*
* CopyRight (c) 2024 momolyl@126.com All Right Reseverd
* ***********************************************************************************************************************************/
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/udp.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <strings.h>
#include <unistd.h>
#include <time.h> // 接受消息线程
void *pthreadrecv_task(void *argv)
{ // 1.创建UDP套接字
int udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
if (udp_socket == -1)
{
fprintf(stderr, "udp socket error,errno:%d,%s\n", errno, strerror(errno));
exit(1);
}
// 2.需要先绑定服务器的端口和地址
struct sockaddr_in host_addr; host_addr.sin_family = AF_INET; // 协议族,是固定的
host_addr.sin_port = htons(atoi("9999")); // 目标端口,必须转换为网络字节序
host_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 目标地址 "192.168.64.xxx" 已经转换为网络字节序 INADDR_ANY bind(udp_socket, (struct sockaddr *)&host_addr, sizeof(host_addr));
// 3.调用recvfrom等待接收数据,并且接收客户端的网络信息
char buf[128] = {0};
struct sockaddr_in client; socklen_t client_len = sizeof(client); // 2.获取当前系统时间
const char *weekday[] = {"日", " 一", " 二", "三", "四", "五", "六"};
char timebuf[128] = {0};
time_t CurrentTime;
while (1)
{ time(&CurrentTime);
struct tm *time = localtime(&CurrentTime);
sprintf(timebuf, "%d年 %02d月 %02d日 星期%s %02d:%02d:%02d", time->tm_year + 1900, time->tm_mon + 1, time->tm_mday,
weekday[time->tm_wday], time->tm_hour, time->tm_min, time->tm_sec); recvfrom(udp_socket, buf, sizeof(buf), 0, (struct sockaddr *)&client, &client_len); // 默认会阻塞
printf("[消息来源:%s 当前时间:%s]:%s\n", inet_ntoa(client.sin_addr), timebuf, buf);
bzero(buf, sizeof(buf));
bzero(timebuf, sizeof(timebuf));
}
} int main(int argc, char *argv[])
{ char timebuf[128] = {0};
pthread_t pthreadrecv;
pthread_create(&pthreadrecv, NULL, pthreadrecv_task, NULL); // 检查参数有效性(多播组地址:224.6.6.6 端口:9999)
if (argc != 3)
{
fprintf(stderr, "argument is invaild ,errno:%d,%s\n", errno, strerror(errno));
exit(1);
} // 1.创建UDP套接字
int udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
if (udp_socket == -1)
{
fprintf(stderr, "udp socket error,errno:%d,%s\n", errno, strerror(errno));
exit(1);
}
// 加入多播组 struct ip_mreqn mutipcast;
struct in_addr imr_multiaddr;
mutipcast.imr_multiaddr.s_addr = inet_addr("224.6.6.6");
mutipcast.imr_address.s_addr = inet_addr("192.168.64.230");
mutipcast.imr_ifindex = 0;
setsockopt(udp_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void *)&mutipcast, sizeof(mutipcast)); // 设置广播属性
int optval = 1;
setsockopt(udp_socket, SOL_SOCKET, SO_BROADCAST, (void *)&optval, 4); // 2.向目标主机发送消息,需要设置目标端口和目标地址
char buf[128] = "HELLO WORLD"; struct sockaddr_in dest_addr;
dest_addr.sin_family = AF_INET; // 协议族,是固定的
dest_addr.sin_port = htons(atoi(argv[1])); // 服务器端口,必须转换为网络字节序
dest_addr.sin_addr.s_addr = inet_addr(argv[2]); // 服务器地址 "192.168.64.xxx" while (1)
{
// 3.向多播组发送内容
sendto(udp_socket, buf, strlen(buf), 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
sleep(5);
} return 0;
}

运行结果:

udp协议实现组播功能的更多相关文章

  1. Android为TV端助力:UDP协议(接收组播和单播)

    private static String MulticastHost="224.9.9.98";private static int POST=19999;private sta ...

  2. 协议无关组播-密集模式 PIM-DM

    一.组播路由协议 (一) 路由器依靠转发项来转发组播数据包.转发项的生成则是组播路由协议所要完成的任务.组播路由协议有距离矢量组播路由协议(DVMRP).协议无关组播-密集模式(PIM-DM).协议无 ...

  3. UDP单播和组播使用SO_REUSEADDR 测试结果

    UDP单播通信 一. 预置条件 A.B在同一台机器,网络中存在往A.B所在的机器的8888端口发送单播UDP数据 A:端口复用绑定在端口8888上 B:端口复用绑定在端口8888上操作步骤:(1)先启 ...

  4. netty的Udp单播、组播、广播实例+Java的Udp单播、组播、广播实例

    网络上缺乏netty的udp的单播.组播案例,经过一番学习总结之后终于把这两个案例调通,下面把这两个案例的代码放在这里分享一下. 首先推荐博文: http://colobu.com/2014/10/2 ...

  5. 计算机网络之网络层IP组播(IGMP、组播路由选择协议、组播地址)

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105318560 学习课程:<2019王道考研计算机网络> 学习目的 ...

  6. 协议无关组播--稀疏模式 PIM-SM

    一. 1)PIM-SM 1.PIM-SM转发.加入 PIM-SM适合于接收成员较少的环境.它与DM有何显著的区别?先看PIM-SM转发机制. 转发: 当组播数据到达路由器时,路由器也会去创建转发项.转 ...

  7. UDP广播,组播服务器

    广播 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/ ...

  8. android怎么打开wifi的组播功能

    http://android.tgbus.com/Android/tutorial/201204/418987.shtml

  9. 《TCP/IP 详解 卷1:协议》第 9 章:广播和本地组播(IGMP 和 MLD)

    我已经懒了,卷一已经是去年年底看完的,但怎么说卷一的坑开了就要填完啊-- 广播和本地组播(IGMP 和 MLD) 引言 有 4 种 IP 地址,单播(unicast).任播(anycast).组播(m ...

  10. Android上UDP组播无法接收数据的问题

    最近,想做一个跨平台的局域网的文件传输软件,思路是组播设备信息,TCP连接传输文件.于是进行了一次简单的UDP组播测试,发现Android对于UDP组播接收数据的支持即极为有限. 部分代码如下 pac ...

随机推荐

  1. Isolution

    <template> <div style="float:left;width: 100%; margin-left: 0"> <el-row > ...

  2. Mybatis if判断中使用了Ognl关键字导致报错解决方法

    mybatis xml中使用OGNL解析参数,如果直接使用了关键字则会导致解析失败. 常见的关键字有: 字段 mybatis关键字 bor (字符|)的英文 xor 字符^的英文 and 字符& ...

  3. Django Paginatior分页,页码过多,动态返回页码,页码正常显示

    问题: 当返回数据较多,如设置每页展示10条,数据接近200条,返回页码范围1~20,前端每个页码都显示的话,就会出现页码超出当前页面,被遮挡的页码无法操作和显示不美观: 代码优化: 在使用pagin ...

  4. W801单片机入门开发环境设置

    W801单片机入门开发环境设置 开发软件下载 烧录工具和SDK 在 WinnerMicro的网站 https://www.winnermicro.com/html/1/156/158/558.html ...

  5. 高通Android UEFI XBL 代码流程分析

    高通Android UEFI XBL 代码流程分析 背景 之前学习的lk阶段点亮LCD的流程算是比较经典,但是高通已经推出了很多种基于UEFI方案的启动架构. 所以需要对这块比较新的技术进行学习.在学 ...

  6. Oracle自动化编译无效对象

    问题描述:使用存储过程的方式对oracle数据库的无效对象,如视图或者同义词进行定期的编译,让他变成一个有效的对象,加上定时任务可以实现自动化的处理.同时在数据库内部创建一个记录表,用来记录被编译过的 ...

  7. ​Chrome插件:Postman Interceptor 调试的终极利器

    今天给大家介绍一款非常实用的工具--Postman Interceptor. 这个工具可以捕捉任何网站的请求,并将其发送到Postman客户端. 对于经常和API打交道的程序员来说,Postman I ...

  8. 构建高可用性、高性能和可扩展的Zabbix Server架构

    简介 本教程讲解了一下如何设计构建一个高性能.高可靠.高扩展的Zabbix 监控集群. 架构图 架构图PDF下载: https://songxwn.com/file/Zabbix_HA.pdf Pig ...

  9. SpringBoot 整合 Sharding-JDBC 分库分表

    导读 分库分表的技术有:数据库中间件Mycat(点我直达),当当网开源的Sharding-JDBC:我们公司用的也是sharding-jdbc,自己也搭建一个完整的项目,直接可以拿来用.下面附源码(C ...

  10. PHP易混淆函数的区别及用法汇总(函数和方法的区别)

    1.echo和print的区别PHP中echo和print的功能基本相同(输出),但是两者之间还是有细微差别的.echo输出后没有返回值,但print有返回值,当其执行失败时返回flase.因此可以作 ...