首页 > 编程语言 >设计程序,要求程序可以加入到一个多播组中并等待服务器发送数据包,并且程序还需要具有发送功能,如果收到数据包则把消息内容输出到终端

设计程序,要求程序可以加入到一个多播组中并等待服务器发送数据包,并且程序还需要具有发送功能,如果收到数据包则把消息内容输出到终端

时间:2024-06-04 21:33:25浏览次数:22  
标签:tstm addr 程序 udp 服务器发送 sizeof include 数据包 socket

目录

题目


小组实现,小组中的每位成员都需要设计程序,要求程序可以加入到一个多播组中并等待服务器发送数据包,并且程序还需要具有发送功能,如果收到数据包则把消息内容输出到终端, 消息内容格式 [消息来源IP 消息时间 ] : 消息内容

分析


1.发送端需设置套接字的广播属性,使用setsockopt()函数,第三个参数需添加SO_BROADCAST;

2.接收端需设置同一端口号并加入组播地址,才能接受同组发送的信息,也需要使用setsockopt()函数,第三个参数需添加IP_ADD_MEMBERSHIP。

代码


/***********************************************************************************
*
*	file name:	udp_client.c
*	author	 :  [email protected] 
*	date	 :  2024/06/04
*	function :  该案例是小组实现,小组中的每位成员都需要设计程序,要求程序可以加入到一个
*				多播组中并等待服务器发送数据包,并且程序还需要具有发送功能,如果收到数据
*				包则把消息内容输出到终端,消息内容格式 [消息来源IP  消息时间 ]:消息内容
* 	note	 :  None
*   version  :
*
*	CopyRight (c)  2023-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 <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
/***********************************************************************************/
/************************************全局变量***************************************/
int udp_socket;		//UDP套接字
/***********************************************************************************/
/*************************************结构体****************************************/
typedef struct lcd_time
{
    int year;		//年
    int mon;		//月
    int mday;		//日
    int wday;		//星期
    int hour;		//时
    int min;		//分
    int sec;		//秒

}LcdTime;
/***********************************************************************************/
/***********************************************************************************
*
*	name	 :	GetTime
*	function :  调用此函数可获取开发板的时间
*	param :  
*				none
*				
*	retval	 :  char *
*	author	 :  [email protected] 
*	date	 :  2024/06/04
* 	note	 :  None
*   version  :
* 	
* *********************************************************************************/
//获取开发板时间
char *GetTime()
{
	//申请堆内存并定义一个记录LCD硬件时间的结构体指针
    LcdTime *tstm = (LcdTime *)calloc(1,sizeof(LcdTime));
	char * tstime = (char *)calloc(1,sizeof(char) * 32);
    //错误处理
    if (NULL == tstm)
    {
        printf("calloc for time failed\n");
		return NULL;
    }

	//4.获取当前系统时间,并把时间转换为特定格式“yy年mm月dd日 星期x tt:mm:ss”
	time_t Tseconds = time(NULL);
	struct tm *ft = localtime(&Tseconds);
	tstm->year = (ft->tm_year) + 1900;     //年从1900年开始
	tstm->mon  = (ft->tm_mon) + 1;         //月份从0开始
	tstm->mday = (ft->tm_mday);
	tstm->wday = (ft->tm_wday);
	tstm->hour = (ft->tm_hour);
	tstm->min  = (ft->tm_min);
	tstm->sec  = (ft->tm_sec);
	sprintf(
				tstime,
				"%d年%02d月%02d日,星期%d,%02d:%02d:%02d",
				tstm->year,
				tstm->mon,
				tstm->mday,
				tstm->wday,
				tstm->hour,
				tstm->min,
				tstm->sec
			);
        //fwrite(data_buffer,BUFFRSIZE,1,fp);
    return tstime;
}
/***********************************************************************************
*
*	name	 :	recv_udp_msg
*	function :  子线程的任务函数,该函数用于接收服务器发送的数据包
*	param :  
*				none
*				
*	retval	 :  none
*	author	 :  [email protected] 
*	date	 :  2024/06/04
* 	note	 :  None
*   version  :
* 	
* *********************************************************************************/
void *recv_udp_msg(void *arg)
{

	//1.需要先绑定服务器的端口和地址
	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);		//目标地址 "192.168.64.xxx"  已经转换为网络字节序  INADDR_ANY

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

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

	while(1)
	{
		p = GetTime();
		recvfrom(udp_socket,buf,sizeof(buf), 0 ,(struct sockaddr *)&client,&client_len); //默认会阻塞
		printf("[%s,%s]:%s\n",inet_ntoa(client.sin_addr),p,buf);
		bzero(buf,sizeof(buf));
	}
}
// 运行客户端可执行文件   ./xxx  服务器端口  服务器地址

int main(int argc,char *argv[])
{
	//检查参数有效性
	// if (argc != 3)
	// {
	// 	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);
	}

	//设置组播选项
	struct ip_mreqn mreqn;
	mreqn.imr_multiaddr.s_addr = inet_addr("226.66.66.66");		//组地址
	mreqn.imr_address.s_addr = htonl(INADDR_ANY);				//本地地址 inet_addr("192.168.64.97")
	mreqn.imr_ifindex = 0;										//接口索引
	
	setsockopt(udp_socket,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreqn,sizeof(mreqn));


	//设置广播属性
	int opt = 1;
	setsockopt(udp_socket,SOL_SOCKET,SO_BROADCAST,&opt,sizeof(opt));

	//设置组播属性
	// setsockopt(udp_socket,IPPROTO_IP,IP_MULTICAST_TTL,&opt,sizeof(opt));

	//2.创建子线程
	pthread_t recv_thread;
	pthread_create(&recv_thread,NULL,recv_udp_msg,NULL);

	//2.向目标主机发送消息,需要设置目标端口和目标地址
	char buf[128] = {0};
	
	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"  

	//3.发送客户端的上线时间
	while(1)
	{
		scanf("%s",buf);
		sendto(udp_socket,buf,strlen(buf),0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));

	}
	
	
	

	return 0;

}

结果


image

标签:tstm,addr,程序,udp,服务器发送,sizeof,include,数据包,socket
From: https://www.cnblogs.com/cwp-home/p/18231795

相关文章

  • 按键中断驱动程序-poll机制
    前言:学东西的时候总是喜欢碎碎念,去思考该怎么学。关于嵌入式开发,以前就觉得嵌入式只是一个工具,关键还是结合专业知识赋能,比如控制、信号处理、神经网络、计算机网络、各种协议比如蓝牙、wifi,音视频,当然,如果能够把内核学的很透彻,那也是很了不起的。现在越学越觉得这个东西应该就是......
  • 新版校园跑腿外卖独立版+APP+小程序前端外卖配送平台源码
    源码介绍:同城校园跑腿外卖配送平台源码,支持自定义diy你可以设计你的页面,设计你自己的风格,支持多校园,独立版本,多商户,有用户端,骑手端,商家端,强大的功演示截图:安装说明:服务器2h4G5M即可,服务器系统:centos8,服务器上安装宝塔面板,不懂怎么安装宝塔的可以百度,所需环境:php7.3......
  • 设计程序实现解析www.baidu.com的域名,把获取到的百度的IP地址全部输出到终端并验证是
    目录题目分析代码结果题目设计程序实现解析www.baidu.com的域名,把获取到的百度的IP地址全部输出到终端并验证是否正确。分析1.通过目标域名获取目标IP地址对应的网络字节序(需强转为对应的类型),使用gethostbyname()函数;2.把获取的网络字节序转换为点分十进制的IP地址(需强......
  • 关于答题判题程序4和家居强电电路模拟程序-1与2的总结
    前言:前面3次作业相对来说比较简单,答题判题程序虽然又更新了,但是有以往的程序基础就比较简单了。这次就只是加上了几个多选选择题和多选填空题,就只要将正则表达式修改一下就可以了基本判断也是可以不用改变的。这次的家电强电电路模拟程序也是比较新颖,其中映入眼帘的就是它的题目要......
  • 健身管理小程序|基于微信开发健身管理小程序的系统设计与实现(源码+数据库+文档)
    健身管理小程序目录基于微信开发健身管理小程序设计与实现一、前言二、系统设计三、系统功能设计 小程序端:后台四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推荐八、源码获取:博主介绍:✌️大厂码农|毕设布道师,阿里云开发社区乘风者计划专......
  • 电影交流|基于SprinBoot+vue的电影交流平台小程序系统(源码+数据库+文档)
     电影交流平台目录目录基于SprinBoot+vue的电影交流平台小程序系统 一、前言 二、系统设计三、系统功能设计 1用户信息管理2电影信息管理3公告信息管理4论坛信息管理四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推荐八、源码获取:......
  • 家居强电电路模拟程序
    智能家居是在当下家庭中越来越流行的一种配置方案,它通过物联网技术将家中的各种设备(如音视频设备、照明系统、窗帘控制、空调控制、安防系统、数字影院系统、影音服务器、影柜系统、网络家电等)连接到一起,提供家电控制、照明控制、电话远程控制、室内外遥控、防盗报警、环境监测、......
  • UDP练习题——实现将自己加入到多播组中并等待服务器发送数据包
    设计程序,要求程序可以加入到一个多播组中并等待服务器发送,数据包,并且程序还需要具有发送功能,如果收到数据包则把消息内容输出到终端,消息内容格,式「消息来源IP消息时间1:消息内容多播地址和端口号/*************************************************************************......
  • 人人都是程序员—AI大模型的应用远比你想像的要简单
    2022年底OpenAI发布了语言大模型chatgpt3.5,它能像人一样跟我们聊天,从此AI市场着了大火,国内外各个顶级科技公司纷纷跟进,出现了一大批的AI大模型,比如文心一言(百度)、Gemini(谷歌)、通义千问(阿里)、讯飞火星(科大讯飞)、豆包(抖音)、kimi(月之暗面)等等,这一年可以称得上是AI元年,AI真正参......
  • 自动化您的Instagram帐户的程序InstaBot Pro 7.0.2
    InstaBotPro是一个自动化您的Instagram帐户的程序。InstaBotPro允许您喜欢,搜索类似帐户上的新订阅者,并让真正的订阅者对您的内容感兴趣。InstaBotPro还允许您向目标用户或帖子发送自动消息和评论。InstaBotPro具有简单方便的界面,您可以为程序设置各种参数,如速度、延迟、......