首页 > 其他分享 >UDP协议实现多播功能

UDP协议实现多播功能

时间:2024-06-06 10:24:00浏览次数:21  
标签:多播 UDP addr 协议 struct udp client include socket

imgimg

/**
 * author	      : [email protected]
 * @brief         : 程序可以加入到一个多播组中并等待服务器发送数据包,并且程序还需要具有发送功能,如果收到数据包则把消息内容输出到终端
 * @date          : 2024/06/06
 * @version       : 1.0  
 * @note          : none
 * CopyRight (c)  2023-2024   [email protected]   All Right Reseverd
 */
#include <stdio.h>
#include <errno.h>
#include <arpa/inet.h>
#include <netinet/udp.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <time.h>
#include <pthread.h>

#define  MULTICAST_ADDR "224.88.88.88"    //多播IP地址
#define  PORT 9999                        //多播端口



//编译                gcc xxx.c -o xxx -pthread
//运行                ./xxx 自身服务器端口



//定义全局变量用于接收UDP套接字
int udp_socket;

/**
 * @function name: client
 * @brief        : 线程任务,客户端可向多播服务端发送消息
 * @param  	     : @arg : 创建线程是传递给client的参数,如无需求则填写NULL  
 * @date         : 2024/06/06
 * @version      : 1.0  
 * @note         : none
 */
//客户端任务
void *client(void *arg)
{
		//2.向目标主机发送消息,需要设置目标端口和目标地址(绑定自身作为客户端)
		char buffer[128] = {0};
		struct sockaddr_in  dest_addr;
		dest_addr.sin_family 		= AF_INET; 			//协议族,是固定的
		dest_addr.sin_port   		= htons(PORT);		//服务器端口,必须转换为网络字节序
		dest_addr.sin_addr.s_addr   = inet_addr(MULTICAST_ADDR);	//服务器IP地址  

		bind(udp_socket,(struct sockaddr *)&dest_addr, sizeof(dest_addr));//绑定服务器和端口

	  while(1)
	  {	
		  printf("请输入内容:");
		  scanf("%s",buffer);

		  //3.发送客户端的上线时间
		  sendto(udp_socket,buffer,strlen(buffer),0, (struct sockaddr *)&dest_addr,sizeof(dest_addr));
	  }

}

/**
 * @function name:	main
 * @brief        :  服务端可接收来自客户端发送的消息
 * @param  	     : @argc : 终端输入参数的个数   
  				 : @argv[] : 终端输入的参数
 * @date         : 2024/06/06
 * @version      : 1.0  
 * @note         : none
 */
int main(int argc,char *argv[])
{

	//检查参数有效性
	if (argc != 2)
	{
		fprintf(stderr, "argument is invaild ,errno:%d,%s\n",errno,strerror(errno));
		exit(1);
	}

	//1.创建UDP套接字             
	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;
	struct ip_mreqn mreq;
	host_addr.sin_family 		= AF_INET; 				//协议族,是固定的
	host_addr.sin_port   		= htons(atoi(argv[1]));	//目标端口,必须转换为网络字节序
	host_addr.sin_addr.s_addr   = htonl(INADDR_ANY); //已经转换为网络字节序INADDR_ANY

	bind(udp_socket,(struct sockaddr *)&host_addr, sizeof(host_addr));

	//加入多播组
    mreq.imr_multiaddr.s_addr = inet_addr(MULTICAST_ADDR);  
    mreq.imr_address.s_addr= htonl(INADDR_ANY); // 或者指定网络接口地址
	mreq.imr_ifindex = 0;
    setsockopt(udp_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));

    //创建客户端线程
	pthread_t hostser;
	pthread_create(&hostser,NULL,client,NULL);


	//3.调用recvfrom等待接收数据,并且接收客户端的网络信息
	char buf[128] = {0};
	struct sockaddr_in  client;
	socklen_t client_len = sizeof(client);

	while(1)
	{   
	    
		recvfrom(udp_socket,buf,sizeof(buf), 0 ,(struct sockaddr *)&client,&client_len); //默认会阻塞

		// 输出消息内容  
        time_t now = time(NULL);  
        printf("client ip is [%s]  time:%s  %s\n", inet_ntoa(client.sin_addr),ctime(&now),buf);  
		bzero(buf,sizeof(buf));
	}
	
	return 0;

}



标签:多播,UDP,addr,协议,struct,udp,client,include,socket
From: https://www.cnblogs.com/lwj294/p/18234602

相关文章

  • TCP协议
    目录传输控制协议(TCP)TCP协议的特点TCP协议的可靠性TCP的连接机制传输控制协议(TCP) 传输控制协议(TCP)用于作为包交换计算机通信网络中的主机以及此类网络的互连系统中的高度可靠的主机对主机协议。TCP协议的特点 TCP协议是面向连接的,端到端可靠的协议,该协议被设计适应支持多网......
  • UDP实现音频视频流传输
    UDP实现音频视频流传输服务器#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<arpa/inet.h>#include<fcntl.h>#include<sys/stat.h>#definePORT8080......
  • 程序可以加入到一个多播组中并等待服务器发送数据包,并且程序还需要具有发送功能,如果收
    /****************************************************************************************************************************************字节序:数据以字节流的方式进行传输,底层都是采用二进制,字节流的顺序是由架构决定的,现在假设使用X86架构,是采用小端存储* 网络......
  • TCP传输协议
    TCP传输协议TCP是一种面向连接的传输协议,提供可靠的数据传输服务。它通过一系列机制确保数据从发送方准确无误地传送到接收方。实现可靠性的原理1、三次握手建立连接第一次握手:客户端发送一个SYN(同步序列号)包给服务器,表明客户端希望建立连接。第二次握手:服务器接收到SYN包,发......
  • 网络编程练习题---利用TCP协议完成客户端与服务端点对点通信
    目录题目一解析代码实现题目二:解析代码实现tcp_client.ctcp_server.c题目一设计程序实现解析www.baidu.com的域名,把获取到的百度的IP地址全部输出到终端并验证是否正确。解析主机打算响应某个网站的网络请求,但是只知道网站域名是无法通信的,需要对域名进行地址解析,得到网站的公......
  • 基于c语言的UDP客户端、服务端二合一基础代码
    基于c语言的UDP客户端、服务端二合一基础代码示意图:准备好了吗,以下是基础代码:/****************************************************************************************************************************************字节序:数据以字节流的方式进行传输,底层都是......
  • 用udp协议传输文件
    用udp协议传输文件目录用udp协议传输文件头文件/宏定义客户端服务器头文件/宏定义#include<stdio.h>#include<stdlib.h>#include<string.h>#include<arpa/inet.h>#include<netinet/in.h>#include<sys/types.h>#include<sys/socket.h>#include<ti......
  • 网络编程中UDP协议通信
    #include<stdio.h>#include<sys/types.h>#include<sys/socket.h>#include<errno.h>#include<stdlib.h>#include<time.h>#include<string.h>#include<netinet/ip.h>#include<netinet/in.h>#include&......
  • TCP协议网络通信
    TCP协议网络通信目录TCP协议网络通信头文件/宏定义客户端服务器验证结果客户端服务器头文件/宏定义#include<stdio.h>#include<stdlib.h>#include<string.h>#include<arpa/inet.h>#include<netinet/in.h>#include<sys/types.h>#include<sys/socket.h>#includ......
  • TCP和UDP
    TCP和UDPTCP的可靠性特性序列号(Sequencing):TCP为每个传输的数据段分配一个唯一的序列号,接收端可以根据这些序列号重新组装数据。确认与重传(AcknowledgmentandRetransmission):TCP使用确认机制来确认数据段是否成功到达。如果接收端没有收到某个数据段,发送端会重传它。流量控......