/**************************************************************************************************************************************
*
* 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. pytest_terminal_summary重写收集测试报告并发送邮件,报错"Argument(s) {'Config'} are declared in the hookimpl but can not be found in the hookspec"

    步骤: 1.conftest.py文件,重写pytest_terminal_summary(terminalreporter, exitstatus, config) 2.run执行pytest.ma ...

  2. JS的JSON.parse问题

    这个问题,已经有非常多人说过,而且由来已久. 大家都提供了不少的解决方法,但是都不够彻底. 一)现在是什么情况 1.使用SpringMvc+ModelAndView+jsp传递值 由于业务需要,通过m ...

  3. Typora行内公式识别不了

    Typora行内公式识别不了,主要是因为行内公式属于LaTeX扩展语法,并非Markdown的通用标准 需要在Typora的"文件"-"偏好设置"-" ...

  4. 【VyOS-开源篇-3】- container for vyos 搭建 Halo 博客-vyos-开源篇

    文章说明:介绍在vyos软路由上配置container容器,vyos最新滚动版1.5已经支持在vyos命令行中启动docker容器,在vyos 官网介绍是说1.3版本之后就都有这个功能了,如果你的版本 ...

  5. HarmonyOS SDK助力中国建设银行探索金融领域创新场景

    今年年初,中国建设银行(以下简称建行)手机银行首批适配HarmonyOS NEXT,并高效实现其应用的核心功能迁移.同时,建行手机银行在HarmonyOS SDK的加持下,充分发挥鸿蒙原生应用在原生智 ...

  6. arm linux 移植 curl

    背景 libcurl是一个跨平台的开源网络协议库,支持http, https, rtsp等多种协议 .libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, ...

  7. mermaid语法画图

    mermaid 脚本语言 graph TB 从上到下 graph BT 从下到上 graph RL 从右到左 graph LR 从左到右 graph LR; A001-->B001; graph ...

  8. LVS介绍与配置

    目录 LVS(Linux Virtual Server) 1. 概述 1.1 LVS简介 1.2 LVS架构 2. LVS工作模式 2.1 NAT模式(Network Address Translat ...

  9. SpringBoot实现单机锁和分布式锁

    1.使用Java的内置锁机制(单机锁) Java提供了synchronized关键字和java.util.concurrent.locks.Lock接口来实现锁. synchronized是Java语 ...

  10. 搜索Python编程获取相关图书信息

    1.获取相关图书信息 #搜索"Python编程"获取相关图书信息 from selenium import webdriver from selenium.webdriver.su ...