首页 > 其他分享 >udp协议实现组播功能

udp协议实现组播功能

时间:2024-06-04 19:11:56浏览次数:13  
标签:协议 udp 组播 addr struct time include socket


/**************************************************************************************************************************************
 *
 *   file name:multicast.c
 *   author   :[email protected]
 *   date     :2024/06/04
 *   brief    :小组实现,小组中的每位成员都需要设计程序,要求程序可以加入到一个多播组中并等待服务器发送数据包,
 * 			   并且程序还需要具有发送功能,如果收到数据包则把消息内容输出到终端,
 * 			   消息内容格式 [消息来源IP  消息时间 ] : 消息内容
 *   note     :运行多播可执行文件   ./multicast  服务器端口  多播组地址
 *
 *   CopyRight (c) 2024    [email protected]    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;
}


运行结果:
image

标签:协议,udp,组播,addr,struct,time,include,socket
From: https://www.cnblogs.com/bell-c/p/18231531

相关文章

  • SIP协议:AOR和Contact作用
    sip协议交互的消息中,通常可以看到一些固定的格式,例如:可以看到消息头中包含“From”,"To","Contact"等字段。这些是起到什么作用呢?From和To是消息交互双方使用的域名,供双方作为位置服务使用。可以通过位置服务将一个URI映射到另一个用户可能使用的URI。而Contact字段包含具体的地......
  • UDP练习题——实现将自己加入到多播组中并等待服务器发送数据包
    设计程序,要求程序可以加入到一个多播组中并等待服务器发送,数据包,并且程序还需要具有发送功能,如果收到数据包则把消息内容输出到终端,消息内容格,式「消息来源IP消息时间1:消息内容多播地址和端口号/*************************************************************************......
  • 安防综合管理系统EasyCVR视频汇聚平台GA/T 1400协议中的关键消息交互示例
    在当今的信息化时代,公共安全防范日益成为保障社会和谐稳定的关键。视频监控系统作为现代安全防范的重要手段,正不断在公安、交通、城市管理等领域发挥着越来越重要的作用。而GA/T1400协议视图库,作为公安视频图像信息应用系统的标准,与视频监控系统的结合使用,无疑为提升监控效果、强......
  • eDP V1.4协议介绍
    一、说明eDP的全称是EmbeddedDisplayPort嵌入式显示端口,主要应用与短距离系统内应用,例如手机、一体式台式机等。eDPV1.4b是基于DPV1.3标准制作完成,但因应用场景的不同,还是有很多区别。电压摆幅不同,eDP相对较低;eDP功耗相对较低;DP有线材和连接器的要求,eDP没有明确要......
  • TCP和UDP的区别
    TCP(传输控制协议)和UDP(用户数据报协议)的区别TCP(TransmissionControlProtocol):1.面向连接:在发送数据之前,TCP需要通过三次握手(SYN、SYN+ACK、ACK)来建立连接,以确保双方可收发数据。2.可靠性:TCP会确保数据在传输过程中的顺序性和完整性。如果数据包丢失或错误,TCP会自动请求重新......
  • 《计算机网络微课堂》实验25 动态主机配置协议DHCP的作用
    下面我们来进行一个仿真实验,本仿真实验的目的在于验证动态主机配置协议DHCP的作用。我已经在软件中构建好了我们理论课中所使用的那个例子,并在各设备旁边标注出了所需的配置信息,我们的应用需求是不给局域网中的各主机手动配置IP地址,子网掩码、默认网关、DNS服务器等信息,而是......
  • 网络编程介绍(二)(端口、通信协议)
    端口标记正在计算机设备上运行的应用程序的,被规定为一个16位的二进制,范围是0~65535。分类周知端口:0~1023,被预先定义的知名应用占用(如:HTTP占用80,FTP占用21)注册端口:1024~49151,分配给用户进程或某些应用程序。动态端口:49152到65535,之所以称......
  • UDP通信
    UDP通信特点:无连接、不可靠通信。不事先建立连接;发送端每次把要发送的数据(限制在64KB内)、接收端IP、等信息封装成一个数据包,发出去就不管了。Java提供了一个java.net.DatagramSocket类来实现UDP通信。DatagramSocket:用于创建客户端、服务端构造器......
  • TCP协议的核心机制
    TCP协议的核心机制一:确认应答机制1.2:超时重传接收缓冲区超时重传时间重置连接一:确认应答机制对于TCP协议来说,要解决的一个很重要的问题,就是可靠传输可靠传输,不是指发送方能够100%的把数据发送给接收方,而是尽可能.尤其是让发送方知道,接收方是否收到.举个......
  • Diffie-Hellman密钥交换协议
    Diffie-Hellman密钥交换协议一.介绍密钥交互协议是一种交互式的密码协议,通过该协议可以使没有任何共享密钥的双方,在公开网络上可以通过某些信息来产生一对共享的安全密钥,安全性是基于离散对数问题的难解性。二.数学原理设p是一个大素数,g是p的原根(即数值gmodp,g^2modp,......