winsock 收发广播包 【转】

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;
}
时间: 2024-08-04 13:39:56

winsock 收发广播包 【转】的相关文章

winsock 收发广播包

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

UDP 收/发 广播包

网络通信基础 如果网络中两个主机上的应用程序要相互通信,其一要知道彼此的IP,其二要知道程序可监听的端口.因为同一主机上的程序使用网络是通过端口号来区分的. UDP Socket的使用过程: 1. 初始化网络库 2. 创建SOCK_DGRAM类型的Socket. 3. 绑定套接字. 4. 发送.接收数据. 5. 销毁套接字. 6. 释放网络库. 广播数据包的原理: 专门用于同时向网络中所有工作站进行发送的一个地址叫做广播地址.在使用TCP/IP 协议的网络中,主机标识段host ID 为全1 的

VM虚拟机虚拟网卡对于UDP发送广播包的影响

近期做一个项目需要用到UDP发送广播包给嵌入式端的程序并要求其作出相应的反馈,一开始非常顺利.但到了测试通用性的阶段发现有的电脑无法发送出UDP广播包,进而也就是无法跟嵌入式端交互(发现并将问题锁定在此就已经花费了非常非常非常多的心血!其中可以ping通嵌入式端这点让人纠结了很久).在问题锁定了之后第一个怀疑的是防火墙,然后是杀毒软件等等,将电脑裸奔满怀希望开启软件之后依然是那副尿性.最后百无聊赖百度了下,在一篇博客的一小段中提到了VM虚拟机的虚拟网络对于UDP发送广播包有影响,突然之间恍然大悟

Android Socket 发送广播包的那些坑

Socket广播包经常被用于局域网内的两台设备之间互相发现和消息传递,在Android应用开发过程中,也经常会遇到这样的需求,例如:两台Android设备之间.Android与手环等智能硬件之间.Android与Windows电脑之间等等. 本文主要介绍在Android中使用Socket开发广播包程序时需要注意的编程事项,以及解决方法. 首先给出一段Android发送广播包的示例代码: DatagramSocket socket = new DatagramSocket(8000); socke

一次处理CentOS服务器被攻击往外发广播包

情况是这样:我们在某地托管的一台linux服务器,突然接到机房电话说是我们机器将整个IDC网络搞瘫了.外部机器没法访问IDC. 挂掉电话后:我就开始考虑,托管机器的机房是有硬防的,我本身一台机器怎么会造成这么大影响.于是又联系机房硬防厂家询问状况,最后得到的答复是我托管的 服务器往外发广播消息,将机房硬防会话都沾满了,其它设备就没有可用会话了. 处理:   情况了解后,我第一反应就是先远程ssh 上去看看.结果connect之后令我大失所望,竟然密码也被修改了,无法访问.那时的感觉就是想撞墙.呵

windows upd广播包无法发送到局域网解决方法

不能发送广播包的电脑和可以发送广播报的主机对比,发现不能发送广播报的主机上都有安装虚拟机,也有虚拟网卡,将所有的虚拟网卡关闭,然后再进行测试,都正常了,无论是Win7,Win10还是Xp. 禁用VMware这两个虚拟网卡,然后就一切正常了. udp广播服务器程序: // BoardCast_Server.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <WinSock2.h> #include <Windows

openVswitch(OVS)源代码分析之工作流程(收发数据包)

前面已经把分析openVswitch源代码的基础(openVswitch(OVS)源代码分析之数据结构)写得非常清楚了,虽然访问的人比较少,也因此让我看到了一个现象:第一篇,openVswitch(OVS)源代码分析之简介其实就是介绍了下有关于云计算现状和openVswitch的各个组成模块,还有笼统的介绍了下其工作流程,个人感觉对于学习openVswitch源代码来说没有多大含金量.云计算现状是根据公司发展得到的个人体会,对学习openVswitch源代码其实没什么帮助:openVswitch

Go如何发送广播包

发送网络数据包成三种方式,每间单播.组播.广播. 广播通俗地讲,就是让你的机器发送的数据包能够被同一个网络内的全部主机都接收到. 在解说怎样发送广播包之前.先来看看跟广播有关的知识: 我们都知道IP地址的作用是用来在网络中定位某个网络接口的(没错,准确的讲.IP并非定位某一台主机). 我们通常见到的IP地址的形式都是例如以下这样子的: XXX.XXX.XXX.XXX 这样的IP地址的形式叫做点分十进制表示法,事实上IP是一个32位长的二进制数,以每8位为单位,共分成4个部分.也就是分成了4个字节

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

本文转自:http://www.cnblogs.com/aikm/p/5022502.html 感谢原创作者! SleepingBug评论:这篇文档写的相当好,受教了,多谢了!   作者:强光手电[艾克姆科技-无线事业部] 在使用EN-Dongle捕获和解析广播包之前,我们先了解一下BLE报文的结构,之后,再对捕获的广播包进行分析.在学习BLE的时候,下面两个文档是极其重要的,这是SIG发布的蓝牙的核心协议和核心协议增补. 核心协议Core_v4.2. 核心协议增补CSS v6. 虽然这两个文档