首页 > 其他分享 >局域网小组群播

局域网小组群播

时间:2024-06-04 18:55:04浏览次数:13  
标签:群播 addr 小组 局域网 time sockfd sizeof include struct

局域网小组群播

目录

头文件/宏定义

#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 <time.h>
#include <pthread.h>

#define MULTICAST_GROUP "223.255.255.555"
#define PORT 8888

函数1

/********************************************************************
 *
 *	name	 :  receive_thread
 *	function :
 *	argument :
 *				@n  :arg
 *
 *	retval	 :  none
 *	author	 :  [email protected]
 *	date	 :  2024年6月4日
 * 	note	 :
 *
 * *****************************************************************/
void *receive_thread(void *arg)
{
    int sockfd = *(int *)arg;
    char buffer[1024];
    struct sockaddr_in source_addr;
    socklen_t addr_len = sizeof(source_addr);

    while (1)
    {
        ssize_t len = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&source_addr, &addr_len);
        if (len < 0)
        {
            perror("接收数据失败");
            continue;
        }
        buffer[len] = '\0';

        char *source_ip = inet_ntoa(source_addr.sin_addr);

        time_t current_time;
        struct tm *time_info;
        char formatted_time[20];

        time(&current_time);
        time_info = localtime(&current_time);
        strftime(formatted_time, sizeof(formatted_time), "%Y-%m-%d %H:%M:%S", time_info);

        printf("来自 %s 的消息,时间:%s,内容:%s\n", source_ip, formatted_time, buffer);
    }

    return NULL;
}

函数1

/********************************************************************
 *
 *	name	 :  send_thread
 *	function :
 *	argument :
 *				@n  :arg
 *
 *	retval	 :  none
 *	author	 :  [email protected]
 *	date	 :  2024年6月4日
 * 	note	 :
 *
 * *****************************************************************/
void *send_thread(void *arg)
{
    int sockfd = *(int *)arg;
    char message[1024];
    struct sockaddr_in dest_addr;
    socklen_t addr_len = sizeof(dest_addr);

    memset(&dest_addr, 0, sizeof(dest_addr));
    dest_addr.sin_family = AF_INET;
    dest_addr.sin_addr.s_addr = inet_addr(MULTICAST_GROUP);
    dest_addr.sin_port = htons(PORT);

    while (1)
    {
        printf("请输入要发送的消息:");
        fgets(message, sizeof(message), stdin);
        sendto(sockfd, message, strlen(message), 0, (struct sockaddr *)&dest_addr, addr_len);
    }

    return NULL;
}

主函数

int main(int argc, char const *argv[])
{
    int sockfd;
    struct sockaddr_in addr;
    struct ip_mreq mreq;

    // 创建套接字
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
    {
        perror("创建套接字失败");
        exit(EXIT_FAILURE);
    }

    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    addr.sin_port = htons(PORT);

    // 绑定套接字
    if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        perror("绑定套接字失败");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    mreq.imr_multiaddr.s_addr = inet_addr(MULTICAST_GROUP);
    mreq.imr_interface.s_addr = htonl(INADDR_ANY);
    // 加入多播组
    if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0)
    {
        perror("加入多播组失败");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    printf("等待数据...\n");

    pthread_t receive_tid, send_tid;
    pthread_create(&receive_tid, NULL, receive_thread, &sockfd);
    pthread_create(&send_tid, NULL, send_thread, &sockfd);

    // 等待线程结束
    pthread_join(receive_tid, NULL);
    pthread_join(send_tid, NULL);

    close(sockfd);
    return 0;
}

标签:群播,addr,小组,局域网,time,sockfd,sizeof,include,struct
From: https://www.cnblogs.com/ljw-boke/p/18231517

相关文章

  • centos下 openssl 生成局域网ip的https证书
    环境准备利用OpenSSL签发证书需要OpenSSL软件及库,一般情况下CentOS、Ubuntu等系统均已内置,可执行openssl确认,如果提示oepnssl:commandnotfound,则需手动安装,以Centos为例:yuminstallopensslopenssl-devel-y生成证书请求文件新建openssl.cnf,内容如下:[req......
  • 《计算机网络微课堂》实验7 虚拟局域网VLAN
    下面我们来进行一个仿真实验咱们仿真实验的内容是学习如何划分VLAN以及验证划分VLAN的作用。首先请您按图所示构建这样一个网络拓扑,然后给各个主机设置相应的IP地址。如果您构建好网络拓扑之后,发现交换机的各个端口并没有显示端口号,那您可以在菜单栏上选择选项,然后参数选择......
  • WiFi串口服务器与工业路由器:局域网应用的协同之力
    在工业物联网(IIoT)迅猛发展的当下,局域网(LAN)作为连接工业设备与数据中心的桥梁,其重要性日益凸显。WiFi串口服务器与工业路由器作为局域网中的关键组件,以其独特的性能和功能,为传统行业的数字化转型提供了强有力的支持。本文将深入探讨WiFi串口服务器与工业路由器如何协同工作,以实现......
  • 关于github的全方位使用和与个人小组项目结合
    一,引言今天给大家介绍的是一款源代码管理工具网站Github,Github是一个基于版本控制软件Git打造的网站对于个人而言,Github提供了丰富的代码托管和版本控制功能,方便开发者管理自己的项目和代码,个人也可以在网站上搜索自己所需要的开源项目或者代码片段,同时也可以在网站上向朋友或......
  • 基于QT的TCP本地与不同局域网(使用公网)的简易聊天工具
    1.前言本文包含了目前平台上大多数的文章所采取的本地tcp构建的聊天室项目,也就是同一局域网通信。同时,我在这里提供不同局域网下实现通信的方法,这里用到的方法是客户端发送消息给服务器,然后服务器再发送给另一个局域网的客户,为了减少工作量,我采取的是用群聊的方式同一接收信息......
  • 如何配置机器人ROS操作系统之间的有线和无线的局域网通信(基于ROS的主从通讯)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言1.主从配置前的准备工作(1)查看主从机的hostname(2)查看各自主机和从机的IP(3)本教程的hostname和ip如下2.在主机中的修改(1)修改主机的/.bashr文件(2)修改主机的hosts文件3.在从机......
  • 《计算机网络微课堂》3-11 虚拟局域网 VLAN
    本节课我们介绍虚拟局域网VLAN的基本概念。‍3.11.1虚拟局域网VLAN概述在之前课程中我们已经介绍过了以太网交换机自学习和转发帧的流程,‍‍以及为避免网络环路而产生的生成树协议。以太网交换机工作在数据链路层,‍‍也包括物理层,使用一个或多个以太网交换机互联起来的交......
  • 结合本小组项目写下能想到的所有 SWOT
    优势(Strengths):技术优势:先进的票务系统和技术,能够提供高效、快捷的购票服务。用户友好界面:良好的用户界面设计和用户体验,可以吸引更多的客户。数据分析能力:通过对用户数据的分析,可以优化定价策略和营销方案。合作伙伴网络:与航空公司和其他旅行相关企业的良好合作关系,能够提供......
  • 小组练习:如果你穿越到1993年,你如何帮助万燕公司?
    1992年,姜万勐看到MPEG芯片Epiphany–用MPEG1把图像和声音同时存储在一张小光盘上VCD(VideoCompactDisc)。1993年9月万燕第一批1000台VCD机下线。几乎都被国内外家电公司买去解剖做样机万燕VCD100%市场份额1995年各路仿制的VCD机大举进军市场,竞争激烈。1996年全国......
  • 小组练习:请列出关于创新感受最深的几点启发
    1.持续学习和探索:创新源自对未知领域的好奇心和探索精神。保持开放的心态,持续学习新知识,接触不同领域的知识和观点,为创新提供灵感和新思路。2.用户需求导向:创新应以满足用户需求为核心。深入了解用户的痛点和需求,从而开发出真正能够解决问题的产品或服务。3.跨学科思维:将不同学......