Diffusion UDP dans Windows 7 - faut-il travailler?
Je suis en train d'écrire un peu de code sous Windows 7 pour diffusion dans l'ensemble de mon réseau local et ne peut pas obtenir le code suivant à travailler. Je viens d'un Linux arrière-plan alors, toutes mes excuses pour le style et le code compile etc et des travaux, et si j'utilise une adresse de:
unsigned long broadcastAddr = inet_addr("192.168.10.0") | ~(inet_addr("255.255.240.0"));
Puis qui fonctionne très bien, seulement je voudrais vraiment utiliser le préféré INADDR_BROADCAST/255.255.255.255 méthode.
<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,'<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);
}
', 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);
}
Cela fonctionne si vous avez, tout simplement, diffusé à 255.255.255.255?
Pas de. J'ai essayé un certain nombre de permutations, mais je ne peux sembler à envoyer sur l'adresse de diffusion dirigée vers l'endroit où vous OU l'IP avec l'inverse du masque de sous-réseau.
Ce qui se passe lorsque vous envoyez des INADDR_BROADCAST ?
Pas de. J'ai essayé un certain nombre de permutations, mais je ne peux sembler à envoyer sur l'adresse de diffusion dirigée vers l'endroit où vous OU l'IP avec l'inverse du masque de sous-réseau.
Ce qui se passe lorsque vous envoyez des INADDR_BROADCAST ?
OriginalL'auteur 17Twenty | 2011-01-06
Vous devez vous connecter pour publier un commentaire.
Il y a un énorme bug dans Windows 7 pour diffusion UDP qui fait de la diffusion sur 255.255.255.255 fonctionne pas sur plus windows 7 installer: https://serverfault.com/questions/72112/how-to-alter-the-global-broadcast-address-255-255-255-255-behavior-on-windows
Fondamentalement, il va envoyer la diffusion sur une seule interface réseau, qui pourrait être n'importe quoi, même quelque chose comme une machine virtuelle d'interface réseau ou bluetooth, ce qui peut ne pas diffuser à n'importe quel appareil.
OriginalL'auteur qwertzguy
À moins que mon peu de maths,
inet_addr("192.168.10.0") | ~(inet_addr("255.255.240.0"))
est le même queinet_addr("192.168.15.255")
qui est l'adresse de diffusion pour ce sous-réseau.Il me semble le plus probable n'est pas que le code d'envoi est mal, mais que la réception de code n'est pas correct. Quelle adresse avez-vous lié à la douille de réception? Ce sous-réseau est-il sur?
OriginalL'auteur AlastairG