UDP Broadcast in Windows 7 - does it work?

11,956

There is a huge bug in Windows 7 for UDP broadcast which makes broadcasting on 255.255.255.255 not work on most windows 7 install: https://serverfault.com/questions/72112/how-to-alter-the-global-broadcast-address-255-255-255-255-behavior-on-windows

Basically it will send the broadcast only on a single network interface, which could be anything, even something like a VM network interface or bluetooth one, which can end up not broadcasting to any device.

Share:
11,956
17Twenty
Author by

17Twenty

Nick is a Senior Software/API Engineer working for freelancer.com providing backend and platform support across the stack using the latest technologies. Drawing on his broad range of experience from board bring up, Linux driver development and systems development through to full stack deployments, web app development and security hardening for both the Linux and Android platforms, Nick continues his independent efforts as a training instructor and consultant delivering courses and expertise on Go, Python and Secure Linux Development across the globe through his company Curiola (www.curiola.com).

Updated on June 04, 2022

Comments

  • 17Twenty
    17Twenty about 2 years

    I'm trying to write some code under Windows 7 to broadcast across my local network and can't get the following code to work. I come from a Linux background so apologies for style - the full code compiles etc and works and if I use an address of:

    unsigned long broadcastAddr = inet_addr("192.168.10.0") | ~(inet_addr("255.255.240.0"));
    

    Then that works fine, I just would really like to use the preferred INADDR_BROADCAST/255.255.255.255 method.

    <snip>
    SOCKET sockfd;
    int broadcast = 1;
    
    WSADATA wsaData;    // Windows socket
    
    // Initialize Winsock
    if (WSAStartup(MAKEWORD(2,2), &wsaData) == SOCKET_ERROR) {
        perror("WinSock Error");
        getc(stdin);
        exit(EXIT_FAILURE);
    }
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
        perror("Socket Error");
        getc(stdin);
            exit(1);
    }
    
    if ((setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, (char *)&broadcast, sizeof(broadcast))) == SOCKET_ERROR) {
        perror("Setsockopt - SOL_SOCKET");
        getc(stdin);
        exit(1);
    }
    
    struct sockaddr_in recvaddr;
    recvaddr.sin_family = AF_INET;
    recvaddr.sin_port = htons(PORT);
    recvaddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
    memset(recvaddr.sin_zero,'\0', sizeof(recvaddr.sin_zero));
    
    int numbytes = 0;
    while ((numbytes = sendto(sockfd, greet, strlen(greet) , MSG_DONTROUTE, (struct sockaddr *)&recvaddr, sizeof(struct sockaddr_in))) != -1) {
            printf("Sent a packet %d\n", numbytes);
            Sleep(100);
    }