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;
}
winsock 收发广播包的更多相关文章
- winsock 收发广播包 【转】
winsock 收发广播包 ☛广播包的概念 广播包通常为了如下两个原因使用:1 一个应用程序希望在本地网络中找到一个资源,而应用程序对于该资源的地址又没有任何先验的知识. 2 一些重要的功能,例如路由 ...
- UDP 收/发 广播包
网络通信基础 如果网络中两个主机上的应用程序要相互通信,其一要知道彼此的IP,其二要知道程序可监听的端口.因为同一主机上的程序使用网络是通过端口号来区分的. UDP Socket的使用过程: 1. 初 ...
- UDP收/发广播包原理及步骤
原文链接地址:http://www.2cto.com/net/201311/254834.html UDP收/发广播包原理及步骤 如果网络中两个主机上的应用程序要相互通信,其一要知道彼此的IP,其二要 ...
- Go如何发送广播包
发送网络数据包成三种方式,每间单播.组播.广播. 广播通俗地讲,就是让你的机器发送的数据包能够被同一个网络内的全部主机都接收到. 在解说怎样发送广播包之前.先来看看跟广播有关的知识: 我们都知道IP地 ...
- [安卓] 20、基于蓝牙BLE的广播包高频快速搜索
前言: 之前介绍过很多蓝牙beacon.搜索.连接.通讯的文章.不过最近我发现:之前写的蓝牙广播包搜索的工程,搜索频率太慢,而且不能一直保持搜索状态.因此,这里探讨下高频蓝牙广播包扫描 -- 蓝牙BL ...
- bcrelay广播包转发器
https://www.mankier.com/8/bcrelay PPTP原是基于PPP的三层通信协议,加入bcrelay后可以将二层的广播包转发到PPTP的client端 在openwrt中实现的 ...
- 蓝牙4.0BLE抓包(二) – 广播包解析
版权声明:本文为博主原创文章,转载请注明作者和出处. 作者:强光手电[艾克姆科技-无线事业部] 在使用EN-Dongle捕获和解析广播包之前,我们先了解一下BLE报文的结构,之后,再对捕获的广播 ...
- 一次处理CentOS服务器被攻击往外发广播包
情况是这样:我们在某地托管的一台linux服务器,突然接到机房电话说是我们机器将整个IDC网络搞瘫了.外部机器没法访问IDC. 挂掉电话后:我就开始考虑,托管机器的机房是有硬防的,我本身一台机器怎么 ...
- windows upd广播包无法发送到局域网解决方法
不能发送广播包的电脑和可以发送广播报的主机对比,发现不能发送广播报的主机上都有安装虚拟机,也有虚拟网卡,将所有的虚拟网卡关闭,然后再进行测试,都正常了,无论是Win7,Win10还是Xp. 禁用VMw ...
随机推荐
- 关于a标签的链接的表现形式
target属性:self在自身标签页里打开 blank在新标签页中打开 1. 链接到其它地址位置.html文档等 <a href="1.html"></a&g ...
- uap--studio设置文本字体
- vim字符串替换
vi/vim 中可以使用 :s 命令来替换字符串.以前只会使用一种格式来全文替换,今天发现该命令有很多种写法(vi 真是强大啊,还有很多需要学习),记录几种在此,方便以后查询. :s/vivian/s ...
- windows 20003 扩展安装后不成功的原因
windows扩展如果安装不成功(PHP扩展)很大的可能就是那个DLL的权限不够.需要分配:AdministratorAuthenticater UsersIIS_WPGSYSTEMUsers
- 常用的dos命令之简略总结
Dos常用命令 一.基础命令 1 dir 无参数:查看当前所在目录的文件和文件夹. /s:查看当前目录已经其所有子目录的文件和文件夹. /a:查看包括隐含文件的所有文件. /ah:只显示出 ...
- Tensor神经网络进行知识库推理
本文是我关于论文<Reasoning With Neural Tensor Networks for Knowledge Base Completion>的学习笔记. 一.算法简介 网络的 ...
- Spring 中各种通知
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- 【POJ2185】【KMP + HASH】Milking Grid
Description Every morning when they are milked, the Farmer John's cows form a rectangular grid that ...
- 16_用LVM扩展xfs文件系统(当分区空间不够时)
1. 查看当前卷组空间(volume group)使用情况 [root@localhost ~]# vgdisplay 从下面的代码中发现剩余空间为0 --- Volume group --- VG ...
- js四舍五入的bug和方法
简单来说js使用原生toFixed(x)截取小数的时候会有误差,出现在比如var o = 0.3303;o.toFixed(3);//0.330 toFixed(x)本来也是一个获取四舍五入的截取方法 ...