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

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

时间:2024-06-05 20:36:42浏览次数:23  
标签:NULL 字节 int 程序 socket 服务器发送 include 数据包 addr

/**************************************************************************************************************************************
*
*   字节序:数据以字节流的方式进行传输,底层都是采用二进制,字节流的顺序是由架构决定的,现在假设使用X86架构,是采用小端存储
*	网络字节序:
*	本地字节序:
*
*	大端存储:低地址存储高字节   当数据超过1个字节的时候才需要区分大端还是小端  假设int型 0x12345678   0x12  | 0x34  | 0x56 |  0x78
*	小端存储:低地址存储低字节   当数据超过1个字节的时候才需要区分大端还是小端  假设int型 0x12345678   0x78  | 0x56  | 0x34 |  0x12
*
*	设备A采用X86架构,所以设备A采用小端存储  待发送的数据 :0x12345678
*   设备B采用ARM架构,所以设备B采用大端存储  待接收的数据 :?
*
*   为了统一发送数据的格式,所以互联网传输的数据统一采用大端方式,为了方便开发,linux系统提供了转换的接口:htonl、htons、ntohl、ntohs
*
*   h :host  主机/本地
*   to:      转换
*   n :net   网络
*   l :long  长整型
*   s :short 短整型
*
*   htons:把本地字节序的一个短整型转换为网络字节序
*   htonl:把本地字节序的一个长整型转换为网络字节序
*   ntohs:把网络字节序的一个短整型转换为本地字节序
*   ntohl:把网络字节序的一个长整型转换为本地字节序
* ***********************************************************************************************************************************/
/**********************************************************************************
 *          
 *          file name:  brostcast.c
 *          author   :  [email protected]
 *          date     :  2024/06/03
 *          function :  程序可以加入到一个多播组中并等待服务器发送数据包,并且程序还需要具有发送功能,如果收到数据包则把消息内容输出到终端,
 *          note     :  None          
 *          CopyRight (c) 2024-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 <time.h>
#include <unistd.h>
#include <pthread.h>
#define __PORT_SERVER 9999
#define GROUP_ADDR_01 "226.66.66.66"  
char senbuf[128] = "123456";
char buf[128] = {0};
char buffer[128] = {0};
/* *********************************************************************************
 *
 *          
 *     @function name:	getsmg
 *     @brief        :  接受多播组的信息
 *     @param        :  
 *                      @arg:线程函数的一个void *地址
 *     @retval       :
 *                      NULL
 *     @date         : 2024/06/03
 *     @version      :1.0 
 *     @note         : NULL
 * 
 *
 * *******************************************************************************/
void *getmsg(void *arg)
{
	int socketfd = *(int *)arg;
	// 接受别的机发送地址
	struct sockaddr_in source_addr;
	socklen_t addr_len = sizeof(source_addr);
	char *source_ip = inet_ntoa(source_addr.sin_addr);

	while (1)
	{
		sleep(2);
		recvfrom(socketfd,buf, sizeof(buf), 0, (struct sockaddr *)&source_addr,&addr_len); // 默认会阻塞
		char *source_ip = inet_ntoa(source_addr.sin_addr);
		printf(" [%s  %s] = %s\n",source_ip, buffer, buf);
		bzero(buf, sizeof(buf));
	}
	return NULL;
}
/* *********************************************************************************
 *
 *          
 *     @function name:	getsmg
 *     @brief        :  向多播组发送信息
 *     @param        :  
 *                      @arg:线程函数的一个void *地址
 *     @retval       :
 *                      NULL
 *     @date         : 2024/06/03
 *     @version      :1.0 
 *     @note         : NULL
 * 
 *
 * *******************************************************************************/
void *sedmsg(void *arg)
{
	struct sockaddr_in dest_addr;
	dest_addr.sin_family = AF_INET;			   // 协议族,是固定的
	dest_addr.sin_port = htons(__PORT_SERVER); // 服务器端口,必须转换为网络字节序
	dest_addr.sin_addr.s_addr = inet_addr(GROUP_ADDR_01);

	while (1)
	{
		sleep(2);
		sendto(*(int *)arg, senbuf, strlen(senbuf), 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
	}
	return NULL;
}


int main(int argc,char *argv[])
{
     time_t timep;

     struct tm *p;

     time(&timep);

     p = gmtime(&timep);
	//将系统时间写入缓冲区
     sprintf(buffer, "%d年%d月%d日 %d:%d:%d", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, 8 + p->tm_hour, p->tm_min, p->tm_sec);

	
	//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(__PORT_SERVER);			//目标端口,必须转换为网络字节序
	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));

	//多播地址
	int iRet = -1;
    setsockopt(udp_socket, SOL_SOCKET, SO_REUSEADDR, &iRet, sizeof(iRet));
    struct ip_mreq mreq;
    mreq.imr_multiaddr.s_addr = inet_addr(GROUP_ADDR_01);               /* 多播组的IP地址               */
    mreq.imr_interface.s_addr = htonl(INADDR_ANY); 
	setsockopt(udp_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));



	pthread_t snd;
	pthread_t get;
	
	pthread_create(&snd,NULL,sedmsg,&udp_socket);
	pthread_create(&get,NULL,getmsg,&udp_socket);

	pthread_join(snd, NULL);
	pthread_join(get, NULL);
	pthread_exit(NULL);
	

}

标签:NULL,字节,int,程序,socket,服务器发送,include,数据包,addr
From: https://www.cnblogs.com/wwwwariana/p/18233725

相关文章

  • 402、基于51单片机的火灾报警(3房间,温度,数码管)(程序+Proteus仿真+原理图+流程图+元器件
    毕设帮助、开题指导、技术解答(有偿)见文未目录方案选择单片机的选择一、设计功能二、Proteus仿真图单片机模块设计三、原理图四、程序源码资料包括:需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。方案选择单片机的选择方......
  • 400、基于51单片机的电压表(1路,ADC0832,LCD1602)(程序+Proteus仿真+原理图+流程图+元器件
    毕设帮助、开题指导、技术解答(有偿)见文未目录方案选择单片机的选择显示器选择方案一、设计功能二、Proteus仿真图单片机模块设计三、原理图四、程序源码资料包括:需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。方案选择......
  • Android应用程序启动源码浅析-(三万字长文慎点&Android14)
    在Android桌面Launcher源码浅析中介绍了Android的桌面程序Launcher是如何响应用户点击事件并启动App的,这篇文章继续介绍App在Android系统层的启动流程。一、启动流程sequenceDiagramparticipantUserparticipantLauncherparticipantActivityManagerService......
  • STM32解决方案2:STM32程序中移植入其他模块注意事项
    Question在一个stm32大的开发程序中,如果要编写完之后移植入一个模块,如果要重新再编写整个程序显然很麻烦。为此,我们以stm32F103的一个程序为例,移植入LCD显示屏模块。(1)在对应的文件夹下导入LCD的文件。(2)在对应文件中添加该头文件(3)在此处加入LCD所在的目录(4)一定要记......
  • 程序分享--常见算法/编程面试题:整数转罗马数字
    关注我,持续分享逻辑思维&管理思维&面试题;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;推荐专栏《10天学会使用asp.net编程AI大模型》,目前已完成所有内容,持续上传中。一顿烧烤不到的费用,让人能紧跟时代的浪潮。从普通网站,到公众号、小程序,再到AI大模型网站。干货满满......
  • 【微信小程序】连接蓝牙设备
    1、检查小程序是否授权蓝牙功能initBluetooth(){constthat=thiswx.getSetting({success:(res)=>{if(res.authSetting.hasOwnProperty('scope.bluetooth')){//'scope.bluetooth'属性存在,且为falseif(!res.aut......
  • Java1.8语言+ springboot +mysql + Thymeleaf 全套家政上门服务平台app小程序源码
    Java1.8语言+springboot+mysql +Thymeleaf 全套家政上门服务平台app小程序源码家政系统是一套可以提供上门家政、上门维修、上门洗车、上门搬家等服务为一体的家政平台解决方案。它能够与微信对接、拥有用户端小程序,并提供师傅端app,可以帮助创业者在不需要相关技术人员及......
  • C++Primer Plus第十二章程序清单12.1~12.3一个失败的例子分析
    12.1.2特殊成员函数StringBad类的问题是由特殊成员函数引起的。这些成员函数是自动定义的,就StringBad而言,这些函数的行为与类设计不符。具体地说,C++自动提供了下面这些成员函数:1,默认构造函数,如果没有定义构造函数;2,默认析构函数,如果没有定义;3,复制构造函数,如果没有......
  • 接上篇,客户端实现,图形界面编程,利用socket和UCP/TCP编写,客户端和服务器端程序可以进行
     1.项目结构 1.1基本架构本项目采用基于Java的`Swing`库进行图形界面开发,并使用`Socket`进行网络通信。项目包名为`org.example.tcp`。 1.2模块划分项目主要分为以下几个模块:图形用户界面(GUI)模块网络通信模块线程处理模块 2.GUI设计 2.1主窗口设计 2.1.1......
  • 程序员转型老中医之路——中医的五运六气都有什么用?
    五运六气在我们日常生活中有什么作用?如何去运用?这一直是我这两年在探索的一个方向!因为我认为中医之所以有这么强大的生命力,就在于它有真实有用的作用和效果,在于对我们老百姓生活有帮助。通过我目前的认识,五运六气可能会有以下几方面作用。第一个作用:可以实现健康预测。也就是......