UDP broadcast package on win7

本文提供了一个Windows环境下发送广播包到指定IP的完整代码示例,解决了win7及以上系统中广播包源IP限制的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于工作需要,我需要实现一个UDP发送广播包到设备的需求。如果是linux下,那很简单。但是上位机要求是windows.

网上简单搜了一下,代码很多。 可我发现就是没办法在设备端收到我发送的广播包。

都不用检查防火墙,我电脑的防火墙早关了。

后来看到stackoverflow.com上面有人也遇到了同样的问题,但是没有给出具体的例子快哭了

简单来说原因是这样的:win7之前的系统,发送广播包是到pc所有的网卡上的。 win7及以后,是要求制定广播包的源IP.简单说bind的IP不能是INADDR_ANY.

下面的例子是可以工作的。

注:%99代码是网上的,我只改了几行。


//--------------------------------------------
#include "stdafx.h"
#include <WinSock2.h>
#include <Windows.h>
#include <string.h>
using namespace std;
#pragma comment(lib, "ws2_32.lib")



int main(int argc, char *argv[])
{
    SOCKET s;
    struct sockaddr_in server, si_other;
    int slen ;
    
    WSADATA wsa;
 
    slen = sizeof(si_other) ;
     
    //Initialise winsock
    printf("\nInitialising Winsock...");
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    {
        printf("Failed. Error Code : %d",WSAGetLastError());
        exit(EXIT_FAILURE);
    }
    printf("Initialised.\n");
     
    //Create a socket
    if((s = socket(AF_INET , SOCK_DGRAM , 0 )) == INVALID_SOCKET)
    {
        printf("Could not create socket : %d" , WSAGetLastError());
    }
    printf("Socket created.\n");
     int so_broadcast = TRUE;
    setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *)&so_broadcast, sizeof(so_broadcast));    
    //Prepare the sockaddr_in structure
    server.sin_family = AF_INET;
    /* the card IP of the PC*/
    printf("send BC package on the port with IP %s\n", argv[1]);
    server.sin_addr.s_addr = inet_addr(argv[1]);   -----------------> SPECIFIC THE IP HERE
    server.sin_port = htons( 9989 );
     
    //Bind
    if( bind(s ,(struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR)
    {
        printf("Bind failed with error code : %d" , WSAGetLastError());
        exit(EXIT_FAILURE);
    }
    puts("Bind done");
     si_other.sin_family = AF_INET;
    si_other.sin_addr.S_un.S_addr =htonl(INADDR_BROADCAST);
    //unsigned long ip = inet_addr("172.17.255.255");
    //b_addr.sin_addr.S_un.S_addr =htonl(ip);
    si_other.sin_port = htons(9988);
    //keep listening for data
    while(1)
    {

         
        //buf the buffer by filling null, it might have previously received data
        char buf[128] = "ADD YOUR PAYLOAD HERE";
         

         
        //now reply the client with the same data
        if (sendto(s, buf, strlen(buf), 0, (struct sockaddr*) &si_other, slen) == SOCKET_ERROR)
        {
            printf("sendto() failed with error code : %d" , WSAGetLastError());
            exit(EXIT_FAILURE);
        }
        printf("send... %d\n", WSAGetLastError());
        Sleep(1000);

    }
 
    closesocket(s);
    WSACleanup();
     
    return 0;
}

### 回答1: android_udpbroadcast_demo 是一个 Android 平台上的示例程序,用于展示如何使用UDP广播进行网络通信。 首先需要明确的是,UDP(User Datagram Protocol)是一种面向无连接的网络传输协议,它不保证数据的可靠性和顺序,但是具有速度快的特点。而广播则是一种将数据包发送给网络上所有设备的通信方式。 在 android_udpbroadcast_demo 中,主要包括以下几个部分的功能: 1. 发送广播:通过UDP协议,将数据包发送给本地局域网内的所有设备。示例程序中提供了发送和停止发送广播的功能。 2. 接收广播:监听网络上的UDP数据包,获取其他设备发送的数据。示例程序中展示了如何设置UDP监听器,并在接收到数据包时进行处理。 3. 显示接收广播数据:将接收到的数据显示在界面上,让用户可以直观地查看广播内容。 通过 android_udpbroadcast_demo,开发者可以学习如何在 Android 平台上实现UDP广播的功能,可以用于实现局域网内的设备间通信、发现和数据传输等功能。例如,可以用于创建多人游戏、局域网聊天应用等。 总之,android_udpbroadcast_demo 是一个帮助开发者了解和学习如何使用UDP广播进行网络通信的示例程序,通过该示例程序,开发者可以掌握如何在Android平台上实现UDP广播的功能。 ### 回答2: android_udpbroadcast_demo是一个用于在Android设备上进行UDP广播通信的示例程序。UDP (User Datagram Protocol) 是一种无连接的传输协议,它可以提供高效的数据传输。在该示例程序中,通过UDP广播,可以实现Android设备之间的快速通信。 Android设备通过使用DatagramSocket和DatagramPacket类来创建一个UDP套接字并发送和接收数据包。在示例程序中,首先创建一个用于接收数据的DatagramSocket,并设置一个固定的广播端口。然后使用一个线程来循环接收来自其他设备广播消息,并对接收到的消息进行处理。 接下来,在发送广播消息之前,需要创建一个新的DatagramSocket和一个DatagramPacket。在发送消息时,将相应的数据封装到DatagramPacket中,并通过UDP广播发送给其他设备。 示例程序还包括了需要添加的权限,例如INTERNET权限和ACCESS_NETWORK_STATE权限,以便可以进行网络通信,并检查设备的网络状态。 通过运行该示例程序,可以在多个Android设备上实现UDP广播通信。例如,可以将一台设备设置为发送广播消息的服务器,其他设备可以接收并处理这些广播消息。这个示例程序可以用于各种场景,例如实时在线聊天、设备之间的实时数据同步等。 总之,android_udpbroadcast_demo是一个完整的示例程序,展示了如何在Android设备上使用UDP广播进行快速通信。使用该示例程序,可以轻松实现Android设备之间的通信,为各种应用场景提供了很大的灵活性和可扩展性。 ### 回答3: android_udpbroadcast_demo是一个使用UDP协议进行广播的Android应用程序示例。 UDP(User Datagram Protocol)是一种无连接的传输协议,它提供了面向数据报的简单传输服务。广播是一种网络通信方式,可以将数据包同时发送给同一局域网中的多个接收者。 在android_udpbroadcast_demo中,首先需要创建一个UDP广播发送器和接收器。发送器负责将数据打包成数据包,并通过UDP广播发送给局域网中的接收器。接收器则负责接收传输过来的数据包,并进行解析处理。 在示例中,可以通过点击按钮或在文本框中输入信息来触发发送广播。发送器将信息封装成数据包,并通过UDP广播发送。接收器侦听局域网中的UDP广播,一旦接收到数据包,就会解析其中的信息,并在界面上显示出来。这样,就实现了同一局域网中多台设备之间的信息交流。 android_udpbroadcast_demo可以用于开发各种需要广播通信功能的Android应用程序。例如,可以用于多人游戏中的消息广播局域网设备的发现与连接、实时通信应用的消息推送等场景。 总之,android_udpbroadcast_demo是一个使用UDP协议进行广播的Android应用程序示例,能够实现同一局域网中多台设备之间的消息传递。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值