☛广播包的概念

广播包通常为了如下两个原因使用: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;
}

转载于:https://www.cnblogs.com/uvsjoh/archive/2012/12/28/2837687.html

winsock 收发广播包相关推荐

  1. UDP收/发广播包原理及步骤

    UDP收/发广播包原理及步骤 如果网络中两个主机上的应用程序要相互通信,其一要知道彼此的IP,其二要知道程序可监听的端口.因为同一主机上的程序使用网络是通过端口号来区分的. UDP Socket的使用 ...

  2. 【蓝牙开发 - BLE】BLE广播包

    前言 对于BLE相关的知识学习,在实际开发中,大部分的开发人员不需要接触到底层的蓝牙协议,更多的是原厂提供的BLE收发或者广播包相关设置等接口,是不涉及到原理部分的内容. 而对于希望进一步的学习蓝牙知 ...

  3. 蓝牙4.0BLE抓包(二) – 广播包解析

    转自: http://www.cnblogs.com/aikm/p/5022502.html 版权声明:本文为博主原创文章,转载请注明作者和出处.    作者:强光手电[艾克姆科技-无线事业部] 在使 ...

  4. Linux内核分析 - 网络[一]:收发数据包的调用

    什么是NAPI NAPI是linux一套最新的处理网口数据的API,linux 2.5引入的,所以很多驱动并不支持这种操作方式.简单来说,NAPI是综合中断方式与轮询方式的技术.数据量很低与很高时,N ...

  5. 遇到一个在linux下无法跨网段发送接收广播包的问题

    正在进行的项目中有个网络广播包搜索设备的模块,需要在上位机发送搜索设备的XML命令,然后设备端再发真正的搜索广播包到交换机上所有的连接设备.测试部反馈了一个bug:无法跨网段搜索到设备,同一个网段内, ...

  6. 2021/9/2 BLE PRA 广播包

    1. RPA 广播包 RPA:  Resolvable private address 可解析私密地址 RAL: Resolvable address  list 可解析地址列表 IRK :ident ...

  7. 蓝牙4.0 BLE 广播包解析

    本文转自:蓝牙4.0BLE抓包(二) – 广播包解析 - 强光手电 - 博客园 感谢原创作者! SleepingBug评论:这篇文档写的相当好,受教了,多谢了! 所有图片水印均是CSDN自动标上的,并 ...

  8. 蓝牙学习五(广播包分析wireshark)

    1.简介 软件工具:wireshark 硬件抓包工具:nrf52840 dongle 2.数据包分析 使用wireshark抓到的数据包分为两个部分,一部分是软件自己添加的内容,另一部分才是广播出来的 ...

  9. Android Socket 发送广播包的那些坑

    转载文章,文章原始出处:http://ticktick.blog.51cto.com/823160/1707858 Socket广播包经常被用于局域网内的两台设备之间互相发现和消息传递,在Androi ...

  10. BLE蓝牙广播包的比特流处理之白噪化和CRC校验

    目标: 1. 通过蓝牙协议了解BLE蓝牙的广播帧结构 2.了解蓝牙比特流处理流程 3.使用matlab重现白噪化和CRC校验 1.蓝牙的广播帧结构: 通过蓝牙BLE协议我们可以看到,蓝牙的广播帧结构如 ...

最新文章

  1. Smokeping图表参数说明
  2. 不能正常关机的处理办法
  3. python如何读取中文文件-如何用Python提取中文关键词?
  4. 理解Linux虚拟文件系统VFS
  5. MySQL高级 - 案例 - AOP记录日志
  6. Python 实现队列
  7. python的try和except_关于python:修复try和except中的无效语法错误
  8. 微信支付开发:当前URL未注册
  9. android6.0原生brower_Android原生下载组件DownloadManager
  10. 计算机休眠状态和关,win7系统关于睡眠和休眠这两种状态的区别
  11. 魅族更新Android10,魅族16S升级90hz?Flyme安卓10如约而至
  12. lol美服服务器修改密码,如何修改LOL美服密码?英雄联盟美服账号密码和邮箱修改教程...
  13. 风控模型评估方法以及大数据风控模型概念
  14. 那些可盐可甜的AI声音,可能都是出自于这家公司
  15. GFD233A 3BHE022294R0103
  16. 「津津乐道播客」#286 津津有味:掐一把春菜,请南方群众尽情凡尔赛
  17. SARscape做DInSAR全流程-以2022年1月青海门源地震为例(超级详细)
  18. java基础学习 --- 第二节 变量、数据类型和运算符
  19. 入门指南:菜鸟如何学习数据分析?
  20. mysqlinstaller安装教程80

热门文章

  1. Redhat 5.4 安装vsftp
  2. JDBC batch批处理Statement executeBatch 具体解释
  3. 对于集成SP3后后不能激活的解释
  4. iText 实践的目录(the content of iText in Action)
  5. 主成分分析法案例_主数据管理第一步——识别主数据
  6. C#中常用字符串操作
  7. filebeat日志采集的一次流程记录
  8. 在计算机系统软件中核心软件,在计算机系统软件中的核心软件是()
  9. linux主机ip数据包抓取,tcpdump和ngrep抓不到本机数据包
  10. 【渝粤教育】国家开放大学2018年秋季 0463-21T英语语音 参考试题