C++ UDP广播通信实现:服务端发送与客户端接收完整示例

Mason
Mason
发布时间:2026-10-14| 6人浏览过
原创

本文详解使用C++实现UDP广播通信的方法。通过配置socket选项并绑定特定地址,服务端可向局域网内所有主机发送数据包,客户端则监听以接收广播信息。

C++广播通信原理与准备

UDP广播允许数据发送到本地子网内的所有设备。在Windows环境(WinSock)下,默认情况下创建的普通Socket不支持广播发送。必须显式开启广播权限才能向广播地址 255.255.255.255 发送数据。

核心要点:

  • 协议类型:AF_INET, SOCK_DGRAM (UDP)
  • 关键操作:setsockopt 设置 SO_BROADCAST
  • 服务端目标地址:INADDR_BROADCAST (即 255.255.255.255)
  • 客户端本地地址:INADDR_ANY (监听所有网卡IP)

第1步:服务端发送广播数据

服务端负责周期性地向广播地址发送消息。需要先初始化Socket库,创建Socket,并设置广播选项。

完整代码逻辑:

#include "InitSock.h"  // 假设此头文件封装了WSAStartup等初始化工作
#include <stdio.h>

VOID main()
{
    CInitSock initSock;  // 自动处理WinSock初始化与清理

    // 1. 创建UDP Socket
    SOCKET s = ::socket(AF_INET, SOCK_DGRAM, 0);
    
    // 2. 设置广播权限(关键步骤)
    BOOL bBroadcast = TRUE; 
    ::setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*)&bBroadcast, sizeof(BOOL));

    // 3. 配置广播地址结构
    SOCKADDR_IN bcast;
    bcast.sin_family = AF_INET;
    bcast.sin_port = htons(4567); // 自定义端口
    bcast.sin_addr.S_un.S_addr = INADDR_BROADCAST; // 255.255.255.255
    
    printf("begin send the data:\r\n");
    char sz[] = "this is the broadcast data";
    
    while(TRUE)
    {
        // 4. 发送数据到广播地址
        ::sendto(s, sz, sizeof(sz), 0, (sockaddr*)&bcast, sizeof(bcast));
        ::Sleep(5000); // 每5秒发送一次
    }
}

第2步:客户端接收广播数据

客户端不需要知道服务端的IP,只需绑定到任意本地IP(INADDR_ANY)和相同的端口号,系统内核会将到达该端口的广播包传递给该Socket。

完整代码逻辑:

#include "InitSock.h"
#include <stdio.h>

void main()
{
    CInitSock initSock;

    // 1. 创建UDP Socket
    SOCKET s = ::socket(AF_INET, SOCK_DGRAM, 0);

    // 2. 绑定本地地址,监听所有网卡上的指定端口
    SOCKADDR_IN sin;  
    sin.sin_family = AF_INET;
    sin.sin_port = ::htons(4567); // 必须与服务端一致
    sin.sin_addr.S_un.S_addr = INADDR_ANY; 
    
    if (::bind(s, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR)
    {
        printf("bind error");
        return; 
    }

    printf("begin recv the broadcast data:\r\n");
    char sz[256] = {0};
    SOCKADDR_IN addrRemote;
    int nLen = sizeof(SOCKADDR_IN); // 注意:recvfrom要求传入的len指针必须准确
    
    while (TRUE)
    {
        // 3. 接收广播数据
        int nRet = ::recvfrom(s, sz, sizeof(sz), 0, (sockaddr*)&addrRemote, &nLen);
        if (nRet > 0)
        {
            sz[nRet] = '\0';      // 确保字符串结尾
            printf(sz);           // 打印接收到的内容
        }
    }
}

注意事项与排错

防火墙问题: Windows防火墙可能拦截UDP广播。如果客户端无法收到数据,请检查防火墙是否允许入站UDP流量或临时关闭防火墙测试。

端口冲突: 确保8-65535范围内的端口未被其他程序占用。上述示例使用的是4567端口。

长度参数: 在 recvfrom 中,nLen 变量必须在调用前初始化为 sizeof(SOCKADDR_IN),否则可能导致接收异常。

以上就是C++实现UDP广播通信的详细内容,更多关于C++网络编程与Socket开发的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。