首页 > 其他分享 >udp 广播通信

udp 广播通信

时间:2024-07-18 11:43:43浏览次数:12  
标签:udp addr 通信 send 广播 fd len recv sin

基于全网段广播的代码示例,要点主要有两个:
(1)设置socket属性SO_BROADCAST
(2)发送方添加广播255.255.255.255的路由,不然会产生“Network is unreachable”错误

ip route add 255.255.255.255 dev eth0

示例代码:


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

#define REMOTE_PORT 22222
#define LOCAL_PORT  55555

int main(int argc,char** argv)
{
    int ret = 0, opt = 1, recv_fd, send_fd;
    struct sockaddr_in local_addr, remote_addr;

    recv_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    send_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if(recv_fd < 0 || send_fd < 0)
    {
        perror("create socket err");
        return -1;
    }

    ret = setsockopt(recv_fd,SOL_SOCKET,SO_BROADCAST,&opt,sizeof(opt));
    if (ret)
    {
        perror("recv sock opt SO_BROADCAST err");
        return -2;
    }
    ret = setsockopt(recv_fd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
    if (ret)
    {
        perror("recv sock opt SO_REUSEADDR err");
        return -3;
    }
    ret = setsockopt(send_fd,SOL_SOCKET,SO_BROADCAST,&opt,sizeof(opt));
    if (ret)
    {
        perror("send sock opt SO_BROADCAST err");
        return -4;
    }

    memset(&local_addr, 0, sizeof(local_addr));
    local_addr.sin_family = AF_INET;
    local_addr.sin_port = htons(LOCAL_PORT);
    local_addr.sin_addr.s_addr = INADDR_ANY;

    memset(&remote_addr, 0, sizeof(remote_addr));
    remote_addr.sin_family = AF_INET;
    remote_addr.sin_port = htons(REMOTE_PORT);
    remote_addr.sin_addr.s_addr = inet_addr("255.255.255.255"); /* INADDR_BROADCAST */

    ret = bind(recv_fd,(struct sockaddr*)&local_addr,sizeof(local_addr));
    if(ret)
    {
        perror("recv sock bind err");
        return -4;
    }

    while(1)
    {
        struct sockaddr_in client_addr;
        socklen_t sock_len = sizeof(client_addr);
        char *ip =NULL;
        int port = 0;
        char buf[1024] = {0};

        /* receive */
        memset(&client_addr, 0, sizeof(struct sockaddr_in));
        client_addr.sin_family = AF_INET;
        int recv_len = recvfrom(recv_fd, buf, sizeof(buf), 0,
                            (struct sockaddr*)&client_addr, &sock_len);
        if (recv_len > 0)
        {
            ip = inet_ntoa(client_addr.sin_addr);
            port = ntohs(client_addr.sin_port);
            printf("recv from [%s][%d]: %s, len: %d\n", ip, port, buf, recv_len);
        }
        else
        {
            perror("recv err");
            continue;
        }

        /* send */
        int send_len = sendto(send_fd, buf, recv_len, 0,
                            (struct sockaddr*)&remote_addr,sizeof(remote_addr));
        if (send_len != recv_len)
        {
            perror("send err");
        }
        else
        {
            ip = inet_ntoa(remote_addr.sin_addr);
            port = ntohs(remote_addr.sin_port);
            printf("send  to  [%s][%d]: %s, len: %d\n", ip, port, buf, send_len);
        }
        // sleep(1);
    }

    close(recv_fd);
    close(send_fd);

    return 0;
}

标签:udp,addr,通信,send,广播,fd,len,recv,sin
From: https://www.cnblogs.com/celticzy/p/18309140

相关文章

  • [会议投稿|SPIE 出版|EI检索]第六届无线通信与智能电网国际会议(ICWCSG 2024)
    一、会议信息:1、会议名称:第六届无线通信与智能电网国际会议(ICWCSG2024)20246th InternationalConferenceonWirelessCommunicationsandSmartGrid2、会议官网:www.icwcsg.net3、会议时间:2024年7月26日-28日4、三轮截稿日期:2024年7月22日23:595、会议地点:中国·大理......
  • C#调用C++库,进行串口通信
    1、添加C++接口实现,将dll放置在运行路径下。dll文件下载:https://files.cnblogs.com/files/ZM191018/SerialPortLib.7z?t=1721271982&download=true[DllImport("SerialPortLib.dll",CharSet=CharSet.Unicode,CallingConvention=CallingConvention.StdCall)]......
  • 《UDP---FTP网络编程》
    UDP网络编程服务端(1)使用DatagramSocket创建socket,监听6666端口(2)使用DatagramPacket创建数据包(3)调用.receive()接收数据包(4)从数据包中读取数据**注意:使用String构造方法,将字节转换为原始的字符串(5)向客户端发送响应消息客户端(1)使用DatagramSo......
  • 【QT开发】串口通信管理QSerialPort类详解及实战应用
    QSerialPort是Qt提供的一个功能强大、简单易用的串口通信类。通过本文的学习,您应该对QSerialPort的基本使用、高级应用技巧及相关注意事项有了全面的理解。在实际项目中,QSerialPort可以帮助实现与外部设备的串口通信,确保数据的可靠传输和接收。希望本文能帮助您更好地......
  • 07:串口通信二
    串口编程1、与波特率之相关的寄存器2、PCON寄存器3、SCON寄存器4、配置的代码分析5、向PC发送一段字符串6、PC机向单片机发送字符控制LED1灯的亮灭1、与波特率之相关的寄存器如图,与串口通信相关的寄存器主要是SCON和PCON寄存器。2、PCON寄存器SMOD:为1时,通信方式1......
  • SPI通信协议
    目录串行外设接口概述基本概念引脚定义工作模式数据格式串行外设接口概述基本概念串行外设接口(SerialPeripheralInterface)的简称也叫做SPI,是一种高速的、全双工同步通信的一种接口,串行外设接口一般是需要4根线来进行通信(NSS、MISO、MOSI、SCK),但是如果打算实现单向通信(最少3根......
  • I2C通信协议
    目录内部集成电路概述基本概念引脚说明通信速率通信过程空闲状态开始信号数据传输应答信号停止信号器件地址内部集成电路概述基本概念内部集成电路(InterIntegratedCircuit)的简称叫做IIC或者I2C,是一种简单的、半双工同步通信的串行通信接口,IIC总线是上世纪80年代(1982年)由飞利......
  • 【计算机网络中的TCP/IP】TCP/IP协议中的tcp与udp
    目录简单介绍一些TCP/IP协议TCP/IP协议的组成TCP/IP协议中tcp与udp的区别1.简单介绍一下TCP/IP协议         TCP/IP(TransmissionControlProtocol/InternetProtocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指......
  • ROS服务通信机制实操Python
    ROS服务通信机制实操Python步骤流程vscode配置服务端客户端编辑配置文件编译并执行优化实现参数的动态提交优化先启动客户端后启动服务端ROS服务通信的理论查阅:ROS服务通信流程理论ROS服务通信的自定义srv数据的准备可以查阅:ROS服务通信自定义srv在模型实现中,ROSm......
  • Python实现基于http通信的protobuf数据传输的案例,包括请求者和接收者
    个人名片......