winsock 收发广播包
☛广播包的概念
广播包通常为了如下两个原因使用: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 收发广播包相关推荐
- UDP收/发广播包原理及步骤
UDP收/发广播包原理及步骤 如果网络中两个主机上的应用程序要相互通信,其一要知道彼此的IP,其二要知道程序可监听的端口.因为同一主机上的程序使用网络是通过端口号来区分的. UDP Socket的使用 ...
- 【蓝牙开发 - BLE】BLE广播包
前言 对于BLE相关的知识学习,在实际开发中,大部分的开发人员不需要接触到底层的蓝牙协议,更多的是原厂提供的BLE收发或者广播包相关设置等接口,是不涉及到原理部分的内容. 而对于希望进一步的学习蓝牙知 ...
- 蓝牙4.0BLE抓包(二) – 广播包解析
转自: http://www.cnblogs.com/aikm/p/5022502.html 版权声明:本文为博主原创文章,转载请注明作者和出处. 作者:强光手电[艾克姆科技-无线事业部] 在使 ...
- Linux内核分析 - 网络[一]:收发数据包的调用
什么是NAPI NAPI是linux一套最新的处理网口数据的API,linux 2.5引入的,所以很多驱动并不支持这种操作方式.简单来说,NAPI是综合中断方式与轮询方式的技术.数据量很低与很高时,N ...
- 遇到一个在linux下无法跨网段发送接收广播包的问题
正在进行的项目中有个网络广播包搜索设备的模块,需要在上位机发送搜索设备的XML命令,然后设备端再发真正的搜索广播包到交换机上所有的连接设备.测试部反馈了一个bug:无法跨网段搜索到设备,同一个网段内, ...
- 2021/9/2 BLE PRA 广播包
1. RPA 广播包 RPA: Resolvable private address 可解析私密地址 RAL: Resolvable address list 可解析地址列表 IRK :ident ...
- 蓝牙4.0 BLE 广播包解析
本文转自:蓝牙4.0BLE抓包(二) – 广播包解析 - 强光手电 - 博客园 感谢原创作者! SleepingBug评论:这篇文档写的相当好,受教了,多谢了! 所有图片水印均是CSDN自动标上的,并 ...
- 蓝牙学习五(广播包分析wireshark)
1.简介 软件工具:wireshark 硬件抓包工具:nrf52840 dongle 2.数据包分析 使用wireshark抓到的数据包分为两个部分,一部分是软件自己添加的内容,另一部分才是广播出来的 ...
- Android Socket 发送广播包的那些坑
转载文章,文章原始出处:http://ticktick.blog.51cto.com/823160/1707858 Socket广播包经常被用于局域网内的两台设备之间互相发现和消息传递,在Androi ...
- BLE蓝牙广播包的比特流处理之白噪化和CRC校验
目标: 1. 通过蓝牙协议了解BLE蓝牙的广播帧结构 2.了解蓝牙比特流处理流程 3.使用matlab重现白噪化和CRC校验 1.蓝牙的广播帧结构: 通过蓝牙BLE协议我们可以看到,蓝牙的广播帧结构如 ...
最新文章
- Smokeping图表参数说明
- 不能正常关机的处理办法
- python如何读取中文文件-如何用Python提取中文关键词?
- 理解Linux虚拟文件系统VFS
- MySQL高级 - 案例 - AOP记录日志
- Python 实现队列
- python的try和except_关于python:修复try和except中的无效语法错误
- 微信支付开发:当前URL未注册
- android6.0原生brower_Android原生下载组件DownloadManager
- 计算机休眠状态和关,win7系统关于睡眠和休眠这两种状态的区别
- 魅族更新Android10,魅族16S升级90hz?Flyme安卓10如约而至
- lol美服服务器修改密码,如何修改LOL美服密码?英雄联盟美服账号密码和邮箱修改教程...
- 风控模型评估方法以及大数据风控模型概念
- 那些可盐可甜的AI声音,可能都是出自于这家公司
- GFD233A 3BHE022294R0103
- 「津津乐道播客」#286 津津有味:掐一把春菜,请南方群众尽情凡尔赛
- SARscape做DInSAR全流程-以2022年1月青海门源地震为例(超级详细)
- java基础学习 --- 第二节 变量、数据类型和运算符
- 入门指南:菜鸟如何学习数据分析?
- mysqlinstaller安装教程80
热门文章
- Redhat 5.4 安装vsftp
- JDBC batch批处理Statement executeBatch 具体解释
- 对于集成SP3后后不能激活的解释
- iText 实践的目录(the content of iText in Action)
- 主成分分析法案例_主数据管理第一步——识别主数据
- C#中常用字符串操作
- filebeat日志采集的一次流程记录
- 在计算机系统软件中核心软件,在计算机系统软件中的核心软件是()
- linux主机ip数据包抓取,tcpdump和ngrep抓不到本机数据包
- 【渝粤教育】国家开放大学2018年秋季 0463-21T英语语音 参考试题