首页 > 其他分享 >实现在多播组中进行数据的发送和接收

实现在多播组中进行数据的发送和接收

时间:2024-06-04 21:35:48浏览次数:8  
标签:多播 组中 addr dest 发送 time sockfd sizeof include

目录

目录


实现在多播组中进行数据的发送和接收

函数文件信息

/*******************************************************************
 * file name: udp_broad.c
 * author   : [email protected]
 * date     : 2024-06-04
 * fileinfo : 设置一个多播组信息并进行绑定,可以向组中发送数据,也可以接收
 *            组内的数据,并输出IP地址和获取到数据的当前时间
 * note     : None
 * version  : 1.0
 * CopyRight (c)   2024  [email protected]  Right Reseverd
 *******************************************************************/

相关头文件、宏定义以及全局变量

#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>
#include <errno.h>
#include <unistd.h>

#define MULTICAST_GROUP "225.1.1.1" // 多播组的ip地址
#define PORT 8888                   // 端口号
#define MAX_BUF_SIZE 1024           // 缓冲数组大小
int sockfd;                         // 套接字文件的句柄

发送数据函数

/********************************************************************
 *
 *	name	 :	receive_thread
 *	function :  用于接收UDP协议数据的线程
 *	argument :  none
 *	retval	 :  调用成功返回生成文件后的结果
 *	author	 :  [email protected]
 *	date	 :  2024/06/04
 * 	note	 :  none
 *
 * *****************************************************************/
void *receive_thread(void *arg)
{
   char databuf[MAX_BUF_SIZE];
   char curr_time[20];
   struct sockaddr_in source_addr;
   socklen_t addr_len = sizeof(source_addr);

   while (1)
   {
       int byte_recvdata = recvfrom(sockfd, databuf, sizeof(databuf), 0, (struct sockaddr *)&source_addr, &addr_len);
       if (byte_recvdata < 0)
       {
           fprintf(stderr, "recv data error,errno:%d,%s\n", errno, strerror(errno));
           continue;
       }
       databuf[byte_recvdata - 1] = '\0'; // 将获取数据包的数组中的末尾"\n"替换成"\0"

       // char *destsource_ip = inet_ntoa(source_addr.sin_addr); // 获取目标源ip的网络字节序,转换为本地字节序

       // 获取当前时间
       time_t current_time = time(NULL);
       struct tm *time_info;
       time_info = localtime(&current_time);
       strftime(curr_time, sizeof(curr_time), "%Y-%m-%d %H:%M:%S", time_info);
       printf("Message source >: [%s %s]    packet data is >: [%s]\n", inet_ntoa(source_addr.sin_addr), curr_time, databuf);
       bzero(databuf, sizeof(databuf));
   }
}

发送数据函数

/********************************************************************
*
*	name	 :	send_thread
*	function :  用于发送UDP协议数据的线程
*	argument :  none
*	retval	 :  调用成功返回生成文件后的结果
*	author	 :  [email protected]
*	date	 :  2024/06/04
* 	note	 :  none
*
* *****************************************************************/
void *send_thread(void *arg)
{
    struct sockaddr_in dest_addr;
    socklen_t dest_addr_len = sizeof(dest_addr);
    char mesdata[MAX_BUF_SIZE];

    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("Enter message to send: ");
        fgets(mesdata, sizeof(mesdata), stdin); // 获取标准输入的数据存入缓存区中
        sendto(sockfd, mesdata, strlen(mesdata), 0, (struct sockaddr *)&dest_addr, dest_addr_len);
        usleep(100000);
    }
}

主函数

int main(int argc, char *argv[])
{
    // 1.创建UDP套接字
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
    {
        fprintf(stderr, "udp socket error,errno:%d,%s\n", errno, strerror(errno));
        exit(1);
    }

    // 2.设置多播组的端口和地址
    struct sockaddr_in broad_addr;
    memset(&broad_addr, 0, sizeof(broad_addr));

    broad_addr.sin_family = AF_INET;                // 协议族,是固定的
    broad_addr.sin_port = htons(PORT);              // 目标端口,必须转换为网络字节序
    broad_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 目标地址 "192.168.64.xxx"  已经转换为网络字节序  INADDR_ANY

    // 3.多播组信息绑定套接字
    bind(sockfd, (struct sockaddr *)&broad_addr, sizeof(broad_addr));

    // 4.加入多播组
    struct ip_mreq mreq;
    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)
    {
        fprintf(stderr, "set socket error,errno:%d,%s\n", errno, strerror(errno));
        exit(1);
    }

    printf("waiting data......\n");

    // 5.创建接收和发送子线程
    pthread_t recv_tid, send_tid;
    pthread_create(&recv_tid, NULL, receive_thread, &sockfd); // 创建接收UDP信息数据的子线程
    pthread_create(&send_tid, NULL, send_thread, &sockfd);    // 创建发送UDP信息数据的子线程

    // 6.等待子线程结束
    pthread_join(recv_tid, NULL);
    pthread_join(send_tid, NULL);

    // 7.关闭套接字文件
    close(sockfd);
    return 0;
}

标签:多播,组中,addr,dest,发送,time,sockfd,sizeof,include
From: https://www.cnblogs.com/wh217/p/18231756

相关文章

  • 设计程序,要求程序可以加入到一个多播组中并等待服务器发送数据包,并且程序还需要具有发
    目录题目分析代码结果题目小组实现,小组中的每位成员都需要设计程序,要求程序可以加入到一个多播组中并等待服务器发送数据包,并且程序还需要具有发送功能,如果收到数据包则把消息内容输出到终端,消息内容格式[消息来源IP消息时间]:消息内容分析1.发送端需设置套接字的广......
  • 多播通信
    网络编程代码:/***************************************************************************************filename:1.c*author: [email protected]*date:2024/06/04*function: 多播通信*note :none*CopyRight(c)202......
  • UDP练习题——实现将自己加入到多播组中并等待服务器发送数据包
    设计程序,要求程序可以加入到一个多播组中并等待服务器发送,数据包,并且程序还需要具有发送功能,如果收到数据包则把消息内容输出到终端,消息内容格,式「消息来源IP消息时间1:消息内容多播地址和端口号/*************************************************************************......
  • Java邮件发送的基本流程是什么?如何实现?
    Java邮件发送的SMTP服务器如何配置?怎么配置发信?Java邮件发送是在Java应用程序中通过邮件协议(如SMTP)发送电子邮件的过程。它是许多企业级应用程序中常见的功能,用于向用户发送通知、确认邮件等。AokSend将介绍Java邮件发送的基本流程,以及其中涉及的关键步骤。Java邮件发送:创建......
  • 程序分享--常见算法/编程面试题:删除有序数组中的重复项 II
    关注我,持续分享逻辑思维&管理思维&面试题;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;有意找工作的同学,请参考博主的原创:《面试官心得--面试前应该如何准备》,《面试官心得--面试时如何进行自我介绍》, 《做好面试准备,迎接2024金三银四》。或关注博主免费专栏【程序......
  • 《计算机网络微课堂》实验11 IP数据报的发送和转发流程
    下面我们来进行一个仿真实验,本仿真实验的内容为观察主机发送IP数据报的过程,以及路由器转发IP数据报的过程。我已经在软件中构建好了之前我们在理论课中所讲解的那幅网络拓扑,并且将需要配置的内容标注在了网络中各设备的旁边。例如主机需要配置IP地址、子网掩码以及指定默认......
  • Q3 LeetCode34 在排序数组中找起始位置
    提交错误:数组访问越界1.验证数组越界的语句要放在执行语句的前面,要不然前面报错无法进行到后面部分2.本题使用两次二分查找,左边界找到后,将rigiht指针设置成mid-1,继续查找更左的边界,右边界同理将left设置成mid+13.newint[]{1,1}  新数组创建方式 1classSolution{......
  • 快团团大团长帮卖团长如何给顾客发送通知?团长运营之家教你怎么做!
    一、功能说明团长可通过订单通知给下单的团员发送通知消息或者发送短信二、具体设置方法(一)如何发送通知消息?第一步:进入团购页面,在“订单管理”中点击“通知”第二步:选择“服务通知”,选择“通知对象”和“消息模板”第三步:点击“发送通知”注意1服务通知需团员......
  • request+pytest根据yaml文件发送请求
    request怎么跟pytest结合起来,然后根据yaml文件去发一个基本的请求呢?下面是一个简单的示例。1、先新建一个名为“demo.yaml”的yaml文件,用来存放测试数据的。-name:G广州研发中心parentid:1#第一次用例的数据正常expect:60008#对请求结果进行断言-nam......
  • 【多区域截屏拼接!】优爱酷定时多区截图屏自动发送工具 原创软件
     优爱酷定时多区截屏自动发送工具 CR优爱酷定时截屏自动发送工具★ 定时截屏自动发送 ★视频演示 不在电脑旁边,如何远程掌握电脑显示状态?实时或按指定时间间隔[钟]将屏幕中指定的区域发送给自己或他人的的多个聊天窗口! #优爱酷定时截图自动发送工具#是一款方便......