UDP Broadcast в Windows 7 - это работает?
Я пытаюсь написать код под Windows 7 для трансляции через мою локальную сеть и не могу заставить работать следующий код. Я пришел из Linux, поэтому извиняюсь за стиль - полный код компилируется и т. Д. И работает, и если я использую адрес:
unsigned long broadcastAddr = inet_addr("192.168.10.0") | ~(inet_addr("255.255.240.0"));
Тогда это прекрасно работает, я просто хотел бы использовать предпочтительный метод INADDR_BROADCAST/255.255.255.255.
<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);
}
2 ответа
В Windows 7 существует огромная ошибка для трансляции UDP, из-за которой трансляция на 255.255.255.255 не работает на большинстве установок Windows 7: https://serverfault.com/questions/72112/how-to-alter-the-global-broadcast-address-255-255-255-255-behavior-on-windows
По сути, он отправляет широковещательную рассылку только по одному сетевому интерфейсу, который может быть чем угодно, даже чем-то вроде сетевого интерфейса виртуальной машины или Bluetooth, который может в конечном итоге не транслироваться ни на одно устройство.
Если только у меня нет математики, inet_addr("192.168.10.0") | ~(inet_addr("255.255.240.0"))
такой же как inet_addr("192.168.15.255")
который является широковещательным адресом для этой подсети.
Мне кажется, что, скорее всего, дело не в том, что отправляющий код неправильный, а в том, что получающий код неправильный. К какому адресу вы привязали получающий сокет? В какой это подсети?