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-21 02:22:54

winsock 收发广播包的相关文章

UDP 收/发 广播包

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

UdpClient无法在局域网中发送UDP广播包的解决办法

问题描述: 在XP或者Win7上面没有办法发送UDP广播报,发送的代码如下所示,应该没有问题. 1 /// <summary> 2 /// 发送消息 3 /// </summary> 4 /// <param name="strDataToSend">要发送的字符串</param> 5 /// <returns>发送成功与否的标识</returns> 6 public bool SendMsg(string str

咨询UDP发送广播包的问题

问题描述 用UDP发送广播包,请问有什么代码例程?求学习谢谢. 解决方案 解决方案二:百度一大把

mina udp 广播-Android Mina框架是否支持UDPClient发送广播包?

问题描述 Android Mina框架是否支持UDPClient发送广播包? 如题,请问mina框架是否支持发送udp广播包,以下面代码发送,会提示服务器异常. // 创建一个tcp/ip 连接 //创建客户端连接器 Log.i("TAG","正在创建Socket连接!"); Log.i("TAG","PORT:"+PORT+",HostName:"+hostName); NioDatagramConnec

请问哪位做过 jpcap 收发数据包的程序,请教

问题描述 现在有个需求即我们需要将pc向硬件设备(在此为ABBplc)发送的代码截获,存储成.cap文件,到时我们需要将此CAP文件带到客户现场将cap文件中的代码移植到现场的PLC设备,说白了就是模拟一个下载过程.根据网上的搜索我们现在已经完成如下工作:1我们可以将本地发送的数据进行截获,保存成CAP文件2于此同时我们也写完模拟下载的方法,但是没有达到预想效果,操作失败该操作都是基于TCP协议的,请问哪位有过TCP底层开发经验,真的希望给提出一些宝贵意见例如是不是每个要发的数据包都要自己封装,

熟悉网络的请进:ping不通,但是mac层收发数据包正常

问题描述 有个问题想请教下,是关于TCP通信方面的.最近手头项目遇到这样一个问题,两台设备间通过TCP进行通信,在A设备使用ping命令,测试与B设备之间的通信链路,发现过了几分钟后ping操作就无法收到B设备的回应.1.在B设备中使用tcpdump工具,发现B设备可以收到A设备发过来的ping请求,B设备也做了正确的回应.2.在A设备端,使用tcpdump工具无法收到B设备的回应数据包.3.但是我们在A设备的mac层数据包抓取中,确实分析到有B设备回应的数据包且数据包格式正确,但是ping操作

E-PON中的ONU用收发一体模块设计

摘要:本文介绍了E-PON(以太无源光网络)系统对ONU(光网络单元)收发一体模块的技术要求以及ONU收发一体模块的基本原理和设计方法,并给出了实验结果. 关键词:E-PON:ONU:突发:收发一体模块:BiDi 1.前言 随着信息社会的快速发展,人们对信息的依赖程度越来越高,对信息量的需求越来越大.Internet业务的普及和发展为人们提供了一种优良的信息获取和交流的平台:此外,随着人们对以高清晰度电视为代表的高带宽信息的需求越来越大,新型的宽带传输技术将越来越多的替代传统的窄带传输技术.在这

网络丢包的原因是什么?

  ICMP回送请求报文是主机或路由器向一个特定的目的主机发出的询问,收到此报文的机器必须给源主机发送ICMP回送回答报文.这种询问报文用来测试目的站是否可到达以及了解其状态. 需要指出的是,ping是直接使用网络层ICMP的一个例子,它没有通过运输层的UDP或TCP. 网络丢包的原因主要有物理线路故障.设备故障.病毒攻击.路由信息错误等,下面我们结合具体情况进行说明. 路由错误 网络路径错误也会导致数据包不能到达目的主机,如主机的默认路由配置错误,主机发出的访问其他网络的数据包会被网关丢弃.但

DHCP过程抓包分析

通过抓包分析,DHCP四个包都为广播包,并且DHCP服务器为了防止地址冲突,在分配给DHCP客户端地址前,还发出arp包,如果是DHCP中继情况,则发出icmp包. 1.DHCP客户端发出DHCP Discover广播包: 二层:源MAC---客户端的mac,目标MAC---FFFF.FFFF.FFFF 三层:源 IP---0.0.0.0,      目标 IP---255.255.255.255 2.DHCP收到DHCP Discover广播包,从地址池中选出从低到高选出地址,并发出arp包: