UDP组播服务端与客户端代码实例

2023-05-16

1.组播服务端代码(数据发送端)

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
 
#define BUF_SIZE 		128
#define PORT     		50001
#define ADDR     		"192.168.1.100"
#define MUNICASTADDR    "235.3.3.3"
 
int main(int argc, char *argv[])
{
    //建立套接字
    int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);           //IPV4,数据报套接字类型,不指定协议
 
    struct sockaddr_in  group_addr;
    memset(&group_addr, 0, sizeof(group_addr));
	group_addr.sin_family = AF_INET,                              //协议类型IPV4
	group_addr.sin_port = htons(PORT),                            //端口号-网络字节序
	group_addr.sin_addr.s_addr = inet_addr(MUNICASTADDR);                 //IP地址-字符串转IP
 
    //发送数据
    char buf[BUF_SIZE] = { 0 };
	int count = 0;
    while (1)
    {
        memset(buf,0, BUF_SIZE);
        sprintf(buf, "%d",count);
		printf("udp client send:[%s - %d]:%s\n",ADDR,PORT,buf);
        sendto(sock_fd, buf, strlen(buf), 0, (const struct sockaddr*)&group_addr, sizeof(group_addr));
		count++;
		sleep(1);
    }
 
    //关闭套接字
    close(sock_fd);
 
    return 0;
}

2.客户端代码

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <iostream>
#include <fcntl.h>

using namespace std;
 
#define BUF_SIZE 		128
#define MULTICASTPROT     		50001
#define ADDR     		"192.168.1.100"
#define MUNICASTADDR    "235.3.3.3"
#define RCV_BUF_SIZE 65535

void print_err(string str)
{
    static char log_buf[1024];
    sprintf(log_buf,"%d:%s",__LINE__,str.c_str());
    cout<<log_buf<<endl;
}
 
int main(int argc, char *argv[])
{
    //建立套接字
    int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);           //IPV4,数据报套接字类型,不指定协议
    if(sock_fd==-1)
    {
        print_err("creat socket failed!");
    }

    //socket可以重新使用一个本地地址
    int flag=1;
    if(setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&flag, sizeof(flag)) != 0)
    {
        print_err("setsockopt failed!");
    }

    int options = fcntl(sock_fd, F_GETFL);
    if(options < 0)
    {
        print_err("get fcntl failed!");
    }
    options = options | O_NONBLOCK;
    int i_ret = fcntl(sock_fd, F_SETFL, options);
    if(i_ret < 0)
    {
        print_err("get non-block failed!");
    }
 
    //声明将连接地址
    struct sockaddr_in  group_addr;
    memset(&group_addr, 0, sizeof(group_addr));
	group_addr.sin_family = AF_INET,                              //协议类型IPV4
	group_addr.sin_port = htons(MULTICASTPROT),                            //端口号-网络字节序
	group_addr.sin_addr.s_addr = inet_addr(MUNICASTADDR);                 //IP地址-字符串转IP
    if (bind(sock_fd, (struct sockaddr*)&group_addr, sizeof(group_addr)) < 0)   //bind multicast addr
    {
        print_err("bond socket failed!");
    }
	
	struct ip_mreq	ipMreq;

	ipMreq.imr_interface.s_addr = inet_addr(ADDR);
	ipMreq.imr_multiaddr.s_addr = inet_addr(MUNICASTADDR);
	if(setsockopt(sock_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &ipMreq, sizeof(ipMreq))!=0)
    {
        print_err("add multicast membership failed!");
    }
    
    //接收数据
    char buf[BUF_SIZE] = { 0 };
    struct sockaddr_in cliaddr;
    socklen_t cliaddrlen = sizeof(cliaddr);
    while (1)
    {
        bzero(buf, BUF_SIZE);
        bzero(&cliaddr, cliaddrlen);
        recvfrom(sock_fd, buf, BUF_SIZE, 0, (struct sockaddr *)&cliaddr, &cliaddrlen);
        printf("udp server from [%s - %hu]:%s\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port),buf);
        sleep(1);
    }
 
    //关闭套接字
    close(sock_fd);
 
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UDP组播服务端与客户端代码实例 的相关文章

随机推荐

  • 企业微信开发实战:自建审批流引擎

    1 概述 企业微信上是这样介绍的 不过经本人的研究测试 xff0c 该工作流引擎的功能是比较有限的 首先只有移动端才能发起 xff0c 流程的定义是必须在企业微信控制台中定义 xff0c 而且不支持条件分支 xff0c 适用于比较简单的应用
  • CmakeLists 复杂c++工程应用实例

    project vir data process cmake minimum required VERSION 2 8 add compile options std 61 c 43 43 11 include directories us
  • ROS学习笔记7_服务端Server

    在上图所示的模型中 xff0c Client作为请求的发送端 xff0c Server端接收Client发送的指令 xff0c 并且完成topic指令的发送 其中请求的信息类型是std srvs Trigger类 xff0c 同时返回一个R
  • char和int转换

    char和int的转换有两种方式 最简单的方法就是利用ASSCII码的差值 xff0c 直接用char的值减去 0 就行了 eg xff1a char a 61 39 9 39 int a 61 a 39 0 39 或者就用atof函数 x
  • printf缓冲区踩坑

    问题 碰到了这样一段代码 经过简化的 span class token macro property span class token directive hash span span class token directive keywo
  • PSINS学习笔记---姿态解算(1)---圆锥运动

    PSINS堪称中国导航领域的福音了 计划将工具箱中常用于工程实际中的相关算法根据个人理解做个解读注释 并且利用严老师网站中公开的数据集进行测试 由于个人水平有限 料想会漏洞百出 希望大家发现了不吝赐教 xff0c 感谢 xff01 1 加载
  • 使用matlab读取excel并作图

    在写论文时无奈非要用matlab xff0c 于是用地面站把传感器数据导出到了excel xff0c 用matlab画个图 用地面站向excel中读入数据 读入完保存即可 我读的是两种传感器数据 xff0c 一个是光流的位置值 xff0c
  • 坐标系梳理

    在很久以来 xff0c 我以为世界上只有两种坐标系 n系导航系和b系机体坐标系 最近在调试厂实验期间才知道原来还有特么这么多坐标系 机体系 xff1a 无人机 潜航器这些刚体自身的坐标系 xff0c 坐标系符合右手法则 xff0c x轴为机
  • 串口通信实现Int或float类型数据传输的方法

    方法 xff1a 发送方拆分数据为多个字节 xff0c 接收方再合并 串口通信程序中发送和接受数据以字节为单位 xff0c 将int或float类型的数据拆成单个字节存放到发送字符数组中 xff0c 然后接收方按照大小端模式将其重新合并为i
  • Gazebo Plugins教程

    Overview of Gazebo plugins Gazebo插件通过标准C 43 43 类直接控制Gazebo模型 xff0c 其具有以下优点 可以控制gazebo中几乎各个方面 xff1b 容易共享 xff1b 能够在运行的系统中插
  • 基于STM32读取SBG Ellipse A型号惯导数据

    之前在飞控上用的都是mpu6050 xff0c 但AUV在执行任务时主要在水下环境 xff0c 收不到GPS信号 xff0c 因此对INS的精度要求较高 xff0c 在姿态解算时要考虑地球自转等因素 xff0c 因此需要一款惯导器件能够感受
  • gcc-arm-none-eabi + scons环境搭建、固件烧录小记

    环境搭建在win7系统下进行 1 装git https gitforwindows org 正常下载即可 xff0c 装完后将git路径 xff08 D Program Files Git bin xff09 添加到环境变量中 添加方法 x
  • C语言中常用宏__FUNCTION_和__FILE__、__LINE__的用法介绍

    C C 43 43 提供了三个宏 FUNCTION FILE 和 LINE 用于定位程序运行时发生错误的位置 程序预编译时预编译器将用所在的函数名 xff0c 文件名和行号替换 当运行时错误产生后这三个宏分别能返回错误所在的函数 xff0c
  • Linux命令发送Http的get或post请求(curl和wget两种方法) 及定时任务的设置

    Http请求指的是客户端向服务器的请求消息 xff0c Http请求主要分为get或post两种 xff0c 在Linux系统下可以用curl和wget命令来模拟Http的请求 下面就来介绍一下Linux系统如何模拟Http的get或pos
  • ROS path问题解决方案

    1 问题描述 1 1 在Roboware里面直接右键运行launch文件会出现如下错误 ResourceNotFound hector gazebo worlds ROS path 0 61 opt ros kinetic share ro
  • ubuntu下socket通信

    点击打开原文链接 第一部分为C 43 43 实现 xff0c 第二部分为python实现 第一部分 该socket 的功能是在客户端输入了两个浮点数组成的字符串 xff0c 在服务端接受后将其转换为浮点数输出 xff0c 统一时刻只能有一个
  • ZED相机深度模式+ZED sl中函数介绍

    ZED SDK提供两种深度感应模式 xff1a STANDARD和FILL 该STANDARD模式是ZED的默认深度感应模式 该STANDARD模式保留距离度量和形状 xff0c 并且比FILL模式运行得更快 xff0c 但它包含由于视觉遮
  • 串行通信的数据位,起始位,停止位?

    参考链接 单片机串口通信一般是11位 xff0c 起始位1bit xff0c 数据位8bit xff0c 校验位1bit xff0c 停止位1bit xff0c 串口通信分两种一种是同步通信 xff0c 一种是异步通信 xff0c 像ps
  • linux的UDP通信编程

    这篇文章将对linux下udp socket编程重要知识点进行总结 xff0c 无论是开发人员应知应会的 xff0c 还是说udp socket的一些偏僻知识点 xff0c 本文都会讲到 尽可能做到 xff0c 读了一篇文章之后 xff0c
  • UDP组播服务端与客户端代码实例

    1 组播服务端代码 xff08 数据发送端 xff09 include lt stdio h gt include lt stdlib h gt include lt stdbool h gt include lt string h gt