winsock 收发广播包

简介: 广播包的概念 广播包通常为了如下两个原因使用:1 一个应用程序希望在本地网络中找到一个资源,而应用程序对于该资源的地址又没有任何先验的知识。 2 一些重要的功能,例如路由要求把它们的信息发送给所有找到的邻机。

广播包的概念

广播包通常为了如下两个原因使用:1 一个应用程序希望在本地网络中找到一个资源,而应用程序对于该资源的地址又没有任何先验的知识。 
2 一些重要的功能,例如路由要求把它们的信息发送给所有找到的邻机。
被广播信息的目的地址取决于这一信息将在何种网络上广播。Internet域中支持一个速记地址用于广播-INADDR_BROADCAST。由于使
用广播以前必须捆绑一个数据报套接口,所以所有收到的广播消息都带有发送者的地址和端口。

广播通信是无连接的通信,通信前不需要建立连接。不需要listen和accept,但需要绑定一个socket用来接收广播。

广播包的发送
创建socket
设置socket,例如设置超时、允许广播等
绑定socket。在使用广播前必须绑定一个socket。这一步可有可无,如果没有,系统自动绑定到一个未用端口。
发送广播。广播的端口号要和接收方绑定的端口号一致

复制代码
#include "stdafx.h"
#include <WinSock2.h>
#include <Windows.h>
#include <string.h>

#pragma comment(lib, "ws2_32.lib")

void autoCleanup()
{
    WSACleanup();
}

int _tmain(int argc, _TCHAR* argv[])
{

    WORD wVersionRequested;
    WSADATA wsaData;
    wVersionRequested=MAKEWORD(2,2);
    int ret;
    ret = WSAStartup(wVersionRequested,&wsaData);

    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    int bc = 1;
    //允许发送广播消息
    int so_broadcast = TRUE;
    ret = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&so_broadcast, sizeof(so_broadcast));
    
    sockaddr_in addr;
    addr.sin_family = AF_INET; //使用互联网际协议,即IP协议
    addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); 
    addr.sin_port = htons(2526);

    //如果仅仅是发送广播,这一步可有可无。没有绑定也能发送广播
    //ret = bind(sock, (struct sockaddr *)&addr, sizeof(addr));

    struct sockaddr_in b_addr;
    b_addr.sin_family = AF_INET;
    b_addr.sin_addr.S_un.S_addr =htonl(INADDR_BROADCAST);
    b_addr.sin_port = htons(2527);


    char buff[50] = "Hello, world!";
    while (1)
    {
        ret = sendto(sock, buff, strlen(buff), 0, (struct sockaddr*)&b_addr, sizeof(b_addr));

        printf("send... %d\n", WSAGetLastError());
        Sleep(3000);
    }

    closesocket(sock);
    atexit(autoCleanup);
    return 0;
}
复制代码

接收广播包
接收方一定要知道广播方的端口号,然后绑定同样的端口号才能正确接收。道理很简单,如果不绑定到一个端口,它不知道到哪里接收数据。

复制代码
// send.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <WinSock2.h>
#include <Windows.h>
#include <string.h>

#pragma comment(lib, "ws2_32.lib")

void autoCleanup()
{
    WSACleanup();
}

int _tmain(int argc, _TCHAR* argv[])
{
    WORD wVersionRequested;
    WSADATA wsaData;
    wVersionRequested=MAKEWORD(2,2);
    WSAStartup(wVersionRequested,&wsaData);

    SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);

    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    //这个端口要和广播方广播端口一致
    addr.sin_port = htons(2527);

    bind(sock, (struct sockaddr *)&addr, sizeof(addr));

    struct sockaddr_in from;
    int len = sizeof(from);
    int ret;
    char buff[50];

    while (1)
    {
        ret = recvfrom(sock, buff, 49, 0, (struct sockaddr *)&from, &len);
        if (ret > 0)
        {
            buff[ret] = 0;
            printf("%s\n", buff);
            printf("%s %d\n", inet_ntoa(from.sin_addr), ntohs(from.sin_port));
        }
    }

    closesocket(sock);
    atexit(autoCleanup);
    return 0;
}
复制代码
目录
相关文章
|
安全 物联网 定位技术
2G网络的逐渐关闭和基站撤销,对车联网的影响
车联网作为汽车与现代信息技术融合的产物,其发展和运营高度依赖于通信网络的支持。在当前的车联网体系中,由于成本、覆盖率和数据需求等多方面因素,2G设备仍然占据一定的比例。然而,随着全球范围内2G网络的逐渐关闭和基站撤销,车联网不可避免地会受到一定影响。以下是对这一影响的详细分析:
|
算法 Python
NumPy 高级教程——性能优化
NumPy 高级教程——性能优化 【1月更文挑战第2篇】
632 0
|
JavaScript
Vue 条件渲染 v-if
Vue 条件渲染 v-if
|
Ubuntu 网络安全 数据安全/隐私保护
如何使用SecureCRT连接ubuntu
1. 首先要明白什么是ssh? 可以把ssh看做是telnet的加强版,telnet的密码和信息都是不加密的,而ssh则加密。 .2. 开启ubuntu上的ssh功能 先安装,安装后就自动开启了.
1525 0
|
1天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1058 0
|
10天前
|
人工智能 运维 安全
|
1天前
|
弹性计算 Kubernetes jenkins
如何在 ECS/EKS 集群中有效使用 Jenkins
本文探讨了如何将 Jenkins 与 AWS ECS 和 EKS 集群集成,以构建高效、灵活且具备自动扩缩容能力的 CI/CD 流水线,提升软件交付效率并优化资源成本。
242 0
|
8天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
9天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。
|
9天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
735 23