首页 > 其他分享 >多播通信

多播通信

时间:2024-06-04 21:02:17浏览次数:12  
标签:多播 addr ip void 通信 include buf socket

网络编程

image

代码:

/*************************************************************************************
 *
 *  file name:  1.c
 *  author   : 	[email protected]
 *  date     :  2024/06/04
 *  function : 	多播通信
 *  note	 :  none
 *  CopyRight (c)   2024    [email protected]   All Right Reserved
 *
 ************************************************************************************/

#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 <sys/types.h>       

int udp_socket;
char w_buf[52]={0};
// 运行客户端可执行文件   ./xxx  服务器端口  服务器地址
 /**
  * @name:		sendm
  * @brief  	向目标主机发送消息
  * @param  	
  				@void *arg
  * @retval 	void *
  * @date 		2024/06/04
  * @note   	none
  */
void *sendm(void *arg)
{	
	//2.向目标主机发送消息,需要设置目标端口和目标地址
	char buf[128];

	struct sockaddr_in  dest_addr;
	dest_addr.sin_family 		= AF_INET; 						//协议族,是固定的
	dest_addr.sin_port   		= htons(60000);			//服务器端口,必须转换为网络字节序
	dest_addr.sin_addr.s_addr   = inet_addr("226.66.66.66");			//服务器地址 "192.168.64.xxx"  
	
	while(1)
	{
		scanf("%s",buf);
		sendto(udp_socket,buf,strlen(buf),0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
	}
	return 0;
}


 /**
  * @name:		gettime
  * @brief  	获取系统时间
  * @param  	
  				@void *arg
  * @retval 	void *
  * @date 		2024/06/04
  * @note   	none
  */
void *gettime(void *arg)
{
	int sec,min,hour,day,week,mon,year;
	// while(1)
	// {
	//利用循环获取系统时间并将它存入变量
		time_t time_sum = time(NULL);
		struct tm *CurTime = localtime(&time_sum);
		sec  = CurTime->tm_sec;
		min  = CurTime->tm_min ;
		hour = CurTime->tm_hour ;
		day  = CurTime->tm_mday ;
		week = CurTime->tm_wday ;
		mon  = CurTime-> tm_mon +1;
		year = CurTime-> tm_year +1900;
	//将变量里的整数用spritf函数全部转换成字符串
	sprintf(w_buf,"%d年%d月%d日,星期%d %d:%d:%d",year,mon,day,week,hour,min,sec);

}
 /**
  * @name:		recvm
  * @brief  	向目标主机发送消息
  * @param  	
  				@void *arg
  * @retval 	void *
  * @date 		2024/06/04
  * @note   	none
  */
void *recvm(void *arg)
{
	//2.向目标主机发送消息,需要设置目标端口和目标地址
	//char buf[128];

	struct sockaddr_in  host_addr;
	host_addr.sin_family 		= AF_INET; 						//协议族,是固定的
	host_addr.sin_port   		= htons(60000);			//服务器端口,必须转换为网络字节序
	host_addr.sin_addr.s_addr   = htonl(INADDR_ANY);
    struct ip_mreqn ip_m;
    ip_m.imr_multiaddr.s_addr= inet_addr("226.66.66.66");
    ip_m.imr_address.s_addr= inet_addr("192.168.64.100");  
    ip_m.imr_ifindex= 0;  
    setsockopt(udp_socket,IPPROTO_IP,IP_ADD_MEMBERSHIP,&ip_m, sizeof(ip_m));

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

	//3.发送客户端的上线时间
	
	//3.调用recvfrom等待接收数据,并且接收客户端的网络信息
	char buf[256] = {0};
	struct sockaddr_in  client;
	socklen_t client_len = sizeof(client);
    int flag =1;
    setsockopt(udp_socket,SOL_SOCKET,SO_BROADCAST,&flag,  sizeof(ip_m));
    
	while(1)
	{
		recvfrom(udp_socket,buf,sizeof(buf), 0 ,(struct sockaddr *)&client,&client_len); //默认会阻塞
		gettime();
        printf("client ip is [%s],time is [%s]:%s\n",inet_ntoa(client.sin_addr),w_buf,buf);
		bzero(buf,sizeof(buf));
	}
	
	return 0;
}


int main(int argc,char *argv[])
{
	//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);
	}
	pthread_t thread;
	pthread_t thread1;
    // pthread_t thread2;
	pthread_create(&thread, NULL, sendm, NULL);
	pthread_create(&thread1, NULL, recvm, NULL);
    // pthread_create(&thread2, NULL, gettime, NULL);

	while(1);
	return 0;
}

结果:

image

标签:多播,addr,ip,void,通信,include,buf,socket
From: https://www.cnblogs.com/lu-ciana/p/18231700

相关文章

  • 网络编程练习题---利用UDP协议实现组播通信
    目录题目解析代码实现题目解析由于该题需要实现组播通信,所以我们需要将套接字文件句柄设置为组播属性,并将需要通信的用户端IP地址,加入组中。由于组播通信需要实现一对多发送消息,所以还需要将套接字文件句柄的广播属性一并开启。由于该题实现过程使用到了线程相关函数接口,所......
  • UDP练习题——实现将自己加入到多播组中并等待服务器发送数据包
    设计程序,要求程序可以加入到一个多播组中并等待服务器发送,数据包,并且程序还需要具有发送功能,如果收到数据包则把消息内容输出到终端,消息内容格,式「消息来源IP消息时间1:消息内容多播地址和端口号/*************************************************************************......
  • Vue3中实现父子组件通信
    Vue3中实现父子组件通信父传子父组件给子组件绑定属性,子组件内部提供props选项接收setup语法糖下局部组件无需注册可以直接使用//父组件中<scriptsetup>importSonComfrom''constmessage=ref('thisisfather')</script><template><SonCom:messgae="mess......
  • Vue3-组件通信详解
    文章目录组件通信的含义Vue3组件通信和Vue2的区别组件通信的具体实现props(父子组件通信)自定义事件(子传父)mitt(任意组件间通信)v-model$attrs(非props的父子组件通信)r......
  • 《计算机网络微课堂》实验22 VLAN间通信的实现方法:单臂路由
    下面‍‍我们来进行一个仿真实验,本仿真实验的目的在于验证VLAN间的通信,‍‍可以使用单臂路由来实现。我已经在仿真软件中构建好了我们理论课中所使用的网络拓扑,‍‍并且在各主机和路由器的各接口旁边都标注好了所需配置的IP地址和地址掩码。​​‍需要说明的是CIDR地址......
  • 《计算机网络微课堂》实验23 VLAN间通信的实现方法:使用三层交换机
    本仿真实验的目的在于验证VLAN间的通信可以使用三层交换机来实现。我已经在仿真软件中构建好了我们理论课中所使用的网络拓扑,并在各主机的旁边都标注好了所需配置的IP地址和地址掩码。​​‍博主注:在视频里使用到了三层交换机,但不知道是哪一种型号的,看到类似的有356024PS......
  • 《计算机网络微课堂》实验21 VLAN间通信的实现方法:多臂路由
    本仿真实验的目的在于验证微软件的通信可以使用多臂路由来实现。‍‍‍我已经在仿真软件中构建好了我们理论课中所使用的网络拓扑,‍‍并且在各主机和路由器的各接口旁边都标注好了所需配置的IP地址和地址掩码。‍‍​​‍需要说明的是三个地址块/后面的数字24,‍‍表明地址......
  • 进程间通信函数接口及应用模板小结
    进程间通信方式1.无名管道/有名管道2.信号3.共享队列(systemV-IPC)4.共享内存(systemV-IPC)5.信号量(systemV-IPC)6.套接字无名管道特征1.文件没有名字,无法使用open2.只能用于亲缘进程间3.半双工工作方式:读写端分开4.写入操作不具有原子性,会被打断,因此只能用于一对一的简......
  • 网络编程介绍(二)(端口、通信协议)
    端口标记正在计算机设备上运行的应用程序的,被规定为一个16位的二进制,范围是0~65535。分类周知端口:0~1023,被预先定义的知名应用占用(如:HTTP占用80,FTP占用21)注册端口:1024~49151,分配给用户进程或某些应用程序。动态端口:49152到65535,之所以称......
  • UDP通信
    UDP通信特点:无连接、不可靠通信。不事先建立连接;发送端每次把要发送的数据(限制在64KB内)、接收端IP、等信息封装成一个数据包,发出去就不管了。Java提供了一个java.net.DatagramSocket类来实现UDP通信。DatagramSocket:用于创建客户端、服务端构造器......