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 收发广播包
☛广播包的概念 广播包通常为了如下两个原因使用: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 ...
随机推荐
- [oldboy-django][2深入django]班级管理(Form)--查看
1 需求:django实现班级管理:查看(分页): 数据库采用django自带的sqlite3 2 数据库表创建 from django.db import models class Classes( ...
- Ubuntu下建立Pycharm快捷方式
修改 Exec, Icon 路径,将文件保存 pycharm.desktop,拖到unity侧边栏 [Desktop Entry]Categories=Development;Comment[zh_C ...
- 【bzoj2242】[SDOI2011]计算器 EXgcd+BSGS
题目描述 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给定y,z,p, ...
- 用.net开发wap
原文发布时间为:2010-08-19 -- 来源于本人的百度文章 [由搬家工具导入] .NET 模板:http://download.csdn.net/source/2631001 WAP应用程序结构 ...
- mysql启动错误1067的解决
安装后MYSQL5后,发现启动出错,有时启动正常,但加接时马上出错. 出错代码:1067 解决办法如下: 删除%windows%/my.ini 删除其它地方的my.ini 在mysql安装 ...
- echarts中关于merge的代码
function merge(target, source, overwrite) { // We should escapse that source is string // and enter ...
- 《手把手教你学C语言》学习笔记(7)---程序的输入与输出
程序设计中,为了观察程序的运行状态和结构,需要输出指定的内容:为了让程序能够更加灵活,可以根据需求输入内容,让计算机处理和运行:所以程序的输入输出就显的尤为重要.主要包括printf和scanf函数. ...
- 剖析CPU温度监控技术【转】
转自:http://blog.csdn.net/hunanchenxingyu/article/details/46476545 迄今为止还没有一种cpu散热系统能保证永不失效.失去了散热系统保护伞的 ...
- PHPCMS V9 采集实例
采集目标: 列表: http://www.cnys.com/zixun/list_2_2.html
- hadoop(一)hadoop简介
1. Hadoop 版本衍化历史 Hadoop 是一个由 Apache 基金会所开发的开源分布式系统基础架构.用户可以在不了解 分布式底层细节的情况下,开发分布式程序,充分利用集群的威力进行高速运算和 ...