UDP Broadcast in Windows 7 - does it work?
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.
![17Twenty](https://i.stack.imgur.com/NItVk.jpg?s=256&g=1)
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, 2022Comments
-
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); }