组播收发数据

article/2025/4/28 21:09:23

1.流程图总结:


2. 代码:
//运行起来一个Sender.exe,和多个Receiver.exe,可以看到组播的效果.//Sender.cpp也可称为服务端

#include <WINSOCK.H>
#include <stdio.h>
#define HELLO_PORT  7905    
#define HELLO_GROUP "228.4.5.6"    
#pragma comment(lib, "WSOCK32.lib")
 
int main(int argc, char *argv[])    
{    
    WSADATA     wsaData;
    WORD wVersionRequested;
    wVersionRequested = MAKEWORD(1,1);
    // Initialize Windows socket library
    WSAStartup(0x0202, &wsaData);
    struct sockaddr_in addr;    
    int fd, cnt;    
    char *message="Hello, World!";    
    /* create what looks like an ordinary UDP socket */    
    if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0)     
    {    
        perror("socket");    
        exit(1);    
    }    
    /* set up destination address */    
    memset(&addr,0,sizeof(addr));    
    addr.sin_family=AF_INET;    
    addr.sin_addr.s_addr=inet_addr(HELLO_GROUP);    
    addr.sin_port=htons(HELLO_PORT);    
    /* now just sendto() our destination! */    
    while (1)    
    {    
        if (sendto(fd,message, strlen(message), 0, (struct sockaddr *) &addr, sizeof(addr)) < 0)     
        {    
            perror("sendto");    
            exit(1);    
        }    
        printf("Send %s\n",message);
        Sleep(1000);    
    }    
    return 0;    
}

//Receiver.cpp也可称为客户端

#include <WINSOCK.H>
#include <stdio.h>
#define HELLO_PORT  7905    
#define HELLO_GROUP "228.4.5.6"    
#define MSGBUFSIZE 256    
#pragma comment(lib, "WSOCK32.lib")
int main(int argc, char *argv[])    
{    
    WSADATA     wsaData;
    WORD wVersionRequested;// Version
    wVersionRequested = MAKEWORD(1,1);//Version Info
    // Initialize Windows socket library
    WSAStartup(wVersionRequested, &wsaData);
    struct sockaddr_in addr;    
    int fd, nbytes,addrlen;    
    struct ip_mreq mreq;    //组播结构体
    char msgbuf[MSGBUFSIZE];    
    u_int yes=1; /*** MODIFICATION TO ORIGINAL */    
    /* create what looks like an ordinary UDP socket */    
    if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0)     //SOCK_DGRAM基于UDP,专门用于局域网.       
    {    
        perror("socket");    
        exit(1);    
    }    
    /**** MODIFICATION TO ORIGINAL */    
    /* allow multiple sockets to use the same PORT number */    
    if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char *)&yes,sizeof(yes)) < 0)     
    {    
        perror("Reusing ADDR failed");    
        exit(1);    
    }    
    /*** END OF MODIFICATION TO ORIGINAL */    
    /* set up destination address */    
    memset(&addr,0,sizeof(addr));    
    addr.sin_family=AF_INET;    
    addr.sin_addr.s_addr=htonl(INADDR_ANY); /* N.B.: differs from sender */    //本地的端口
    addr.sin_port=htons(HELLO_PORT);       //这个端口必须和组播的端口一致
//     addr.sin_port=htons(5000);    
 
    /* bind to receive address */    
    if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0)    
    {    
        perror("bind");    
        exit(1);    
    }    
    /* use setsockopt() to request that the kernel join a multicast group */    
    mreq.imr_multiaddr.s_addr=inet_addr(HELLO_GROUP);  //组播组的ip地址  
    mreq.imr_interface.s_addr=htonl(INADDR_ANY);       //加入的客户端主机的ip地址  INADDR_ANY为0.0.0.0,泛指本机,表示本机所有的ip.
 
    //客户端只有在加入多播组后才能接受多播组的数据
    if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *)&mreq,sizeof(mreq)) < 0)   //IP_ADD_MEMBERSHIP:加入组播组
    {    
        int err=GetLastError();
        printf("setsockopt:%d",err);    
        exit(1);    
    }    
    /* now just enter a read-print loop */    
    while (1)     
    {    
        //ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);    
        addrlen=sizeof(addr);  
        printf("Receiving..."); 
        //if((nbytes=recvfrom(fd,msgbuf,MSGBUFSIZE,0,NULL,NULL))<0)
        if ((nbytes=recvfrom(fd, msgbuf, MSGBUFSIZE, 0, (struct sockaddr *) &addr, (int *)&addrlen)) < 0)     //addr:指向装有源地址的缓冲区  addrlen:指向缓冲区的长度
        {    
            perror("recvfrom");    
            exit(1);    
        } msgbuf[nbytes]  ='\0'; 
        printf("%s, RECEIVED FROM:%s\n",msgbuf, inet_ntoa(addr.sin_addr));    
    }    
    return 0;    
}

————————————————
版权声明:本文为CSDN博主「StephenQin」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Stephen___Qin/article/details/120466515


http://chatgpt.dhexx.cn/article/dcF4jva9.shtml

相关文章

路由-单播、广播、组播

根据目标地址判断 类型 备注 单播 Unicast 发送给单个设备&#xff08;明确目标地址&#xff09; 广播 Broadcast 发送给所属广播域内的所有设备&#xff08;目标地址不明确&#xff09; MAC地址全F&#xff0c;IP地址全1 组播 Multicast 发送给一组目标 MA…

Alitum Designer 出现警告:[Warning] xxx.SchDoc Compiler Net xxx has no driving source

问题描述&#xff1a;Alitum Designer 在进行编译检查时&#xff0c;出现警告&#xff1a;Class Document Source Message Time Date No. [Warning] xxx.SchDoc Compiler Net xxx has no driving source (Pin J1-28,Pin U23-15,Pin U24-3) 20:01:18 2020/11/14 13。 问题分析&…

AD14.3绘制PCB教程

文档下载链接&#xff1a; 点此下载文档&#xff1a;AD14绘制PCB教程_V2.3_20200319.doc 或打开此链接下载&#xff1a; https://download.csdn.net/download/Ace_Shiyuan/12256474或通过如下方法逐步查找&#xff1a; 个人主页 -> 资源 -> AD14绘制PCB教程_V2.3_202…

学习AD常见错误(2)

1、在一个工程里新建多个原理图&#xff0c;会报元器件命名重复的问题 这种时候就要修改该元件的命名&#xff0c;该错误的报错就会消失。 2、问题描述&#xff1a;Alitum Designer 在进行编译检查时&#xff0c;出现警告&#xff1a;Class Document Source Message Time Date…

使用Altium Designer绘制STM32最小系统板及SD卡原理图

目录 一、前言二、AD工程的创建1、创建一个属于我们自己的工程2、元器件的封装 三、原理图绘制1、模块的绘制2、排版与分区3、SD模块的绘制 效果展示总结参考资料 一、前言 在学习了这么久的嵌入式&#xff0c;我们似乎还没有仔细了解过真正的嵌入式系统的原理图&#xff0c;咱…

如何将立创 EDA 的封装导入到 AD/PADS 软件中

立创 EDA,深受个人玩家和学生的喜爱,有现成的封装,再配合立创商城,很便捷。 在公司内部,用的很少,受限于性能、迭代维护等原因。 本文介绍如何将立创 EDA 里面的封装导入到 AD/PADS 中,为我们所用,立创封装一部分来自官方,另一部分来自个人,所以不能过分依赖,保不…

AD学习笔记(一)基础认识

文章目录 AD学习笔记第一讲 AD基础认识一、两库两图&#xff08;分别对应下图&#xff09;1、PCB图&#xff08;pcbdoc&#xff09;2、原理图&#xff08;schdoc&#xff09;3、原理图库&#xff08;schlib&#xff09;4、PCB库&#xff08;pcblib&#xff09; 二、封装1、DIP封…

PCB如何入门---一些经验与教训

从刚接触PCB打板到现在&#xff0c;磕磕碰碰的也是总结了一些经验&#xff0c;供大家参考借鉴一下。 首先&#xff0c;一开始接触PCB的入门&#xff0c;我是从b站上凡亿教育入门的 当然&#xff0c;这里没有打广告的嫌疑哈&#xff01;&#xff01;&#xff0c;这门课用的AD20…

protel dxp2004第三讲之仿真设计

今天给大家讲讲这款软件的仿真设计&#xff1a; Protel DXP 电路仿真概述 基于最新的Spice 3f5 模拟模型和XSPICE Simcode 数字模型仿真内核, Protel DXP 内嵌一个功能强大的A/D 混合信号仿真器,设计人员在进行原理图设计输入后,即可正确地仿真模拟和数字器件而无需通过A/D 转…

AD20安装、新建文件和一个小demo

一、软件的安装&#xff08;20&#xff09; AD20软件的安装包&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1naJ34qKRv0ZjTamTGAA0_w 提取码&#xff1a;dg68 安装步骤&#xff1a; https://mp.weixin.qq.com/s/Z81ajUtaGF149KN_Pe9qpw 二、文件新建过程 可以在电…

Altium Designer 18中的Violations Associated with Documents

Altium Designer 18中“工程选项”对话框“Error Reporting(错误报告)”选项卡第三项错误设置,是Violations Associated with Documents(与文件有关的错误),含有10条错误,如下图所示,软件官网https://www.altium.com/documentation只给出了8条错误说明。 Violations …

Altium Designer 学习笔记

Altium Designer 学习笔记 学习参考 B站凡亿教育AD20学习教程 如想获得更好阅读体验&#xff0c;可点击以下链接&#xff1a;AD20学习笔记 文章目录 Altium Designer 学习笔记快捷键总览第一部分&#xff1a;课程介绍、学习方法及元件库的创建1. 课程思路2. 新建工程3. 元件库…

PCB原理图绘制(2)——工程文件的初步修改与设置

PCB原理图绘制&#xff08;2&#xff09;——工程文件的初步修改与设置 1.修改原理图(sheet.schdoc)的大小与其他特性 &#xff08;Design-Document Options&#xff09; 2.为PCB板(pcb.pcbdoc)添加中间层 &#xff08;Design-Layer Stack Manager-&#xff08;选中Core如图…

ADPCB设计流程

一.创建文件夹 二.打开AD创建工程 创建PrjPcb项目保存在PCB_Project文件夹中 创建SchDoc文件保存在SchDoc文件夹中 创建PcbDoc文件保存在PcbDoc文件夹中 创建SchLib文件保存在SchLib文件夹中 创建PcbLib文件保存在PcbLib文件夹中 1.在SchLib中画AD库中没有的元器件原理图&#…

Altium Designer 2020 学习笔记(一)-----原理图及原理图库部分(配动态图操作演示)

本篇文章主要与大家简要分享一下&#xff0c;我在AD学习过程中的一些学习笔记&#xff0c;本篇文章主要关于原理图及原理图库部分。 本系列文章链接&#xff1a; ----------------------------------------------------------------------------- Altium Designer 2020 学习笔…

【Altium Designer】新建工程

Altium Designer的文件体系 Altium Designer的一个工程&#xff0c;包含了4个重要文件&#xff0c;其他文件可有可无&#xff0c;这4个文件是非常重要的&#xff0c;由这4个文件&#xff0c;构成了最基本的Altium Designer工程 SchDoc&#xff08;原理图&#xff09;SchLib&a…

ku060 schdoc connect record

flash JTAG信号&#xff0c;最基本的要有5条线&#xff0c;TCK TMS,TDI,TDO,复位信号。 复位信号&#xff0c;有的一条&#xff0c;有的多条&#xff0c;他的作用是镇压CPU&#xff0c;让他停下所有工作&#xff0c;等着JTAG信号对它进行控制&#xff0c;或者让其某部分工作…

AD软件中的pcbdoc、schdoc等类似一些文件的图标变成了白板解决办法

问题案例&#xff1a; 解决办法如下&#xff1a; 方法一&#xff1a;Win系统设置 打开Win系统的设置 默认应用——按文件类型指定默认应用 将pcbdoc、schdoc之类的文件全部选为AD软件即可 方法二&#xff1a;使用AD软件自带的设置 参考自&#xff1a;http://blog.chinaae…

STM32工作笔记0055---认识pcbdoc文件Schdoc文件

技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152 可以直接在浏览器上访问EasyEDA用EasyEDA打开。 https://easyeda.com/editor 可以看到: PCB是Printed circuit board这3个单词的首字母,翻译成中文是“印刷电路板”的意思,取其生产工艺如同印刷一样,简要…

AD学习笔记(4)

AD学习笔记&#xff08;4&#xff09; 1、元件的放置 两种方法&#xff1a; 其一是在SCHLib界面&#xff0c;选定器件后点击Place跳转到SCHDoc中进行放置&#xff1b;其二是在SCHDoc界面中&#xff0c;通过右下角Panels选项卡打开components&#xff0c;从而可以在已有的库或…