[C++] Probleme avec un broadcast UDP
Cédric
-
Rarenlys -
Rarenlys -
Bonjour à tous,
J'aimerais réaliser un broadcast par UDP sur le port 12001 (ou autre) ! J'ai fais pas mal de recherches et en glanant deux trois bout de codes par ci par la, j'ai fait un petit programme ... Néanmoins, après avoir sniffé sur ma carte réseau, je ne vois aucunde demande de broadcast... mon programme ne marche donc pas xD !
Si quelqu'un pouvait m'éclairer sur ce probleme...
Je vous remercie d'avance !
Mon code :
#include <iostream>
#include <io.h>
#include <winsock.h>
#include <winsock2.h>
#include <windows.h>
using namespace std;
int ouvreSocket(int port);
int main(void)
{
int on ;
int tailleAd;
int skDesc;
int portDiff = 6001;
struct sockaddr_in adDiffusion;
unsigned long adDiff;
char nbNet;
skDesc = ouvreSocket(6001); /* Créé socket UDP (déconnectée) */
adDiff = inet_addr("255.255.255.255"); /* Adresse -> broadcast */
printf("Adresse de broadcast = 0x%lX\n", adDiff);
adDiffusion.sin_addr.s_addr = adDiff; /* Identificateur de l'hote */
adDiffusion.sin_family = AF_INET; /* Type de la socket du serveur */
adDiffusion.sin_port = htons(portDiff); /* Port des serveurs */
tailleAd = sizeof(adDiffusion);
/* Met la socket en mode broadcast */
on = 1;
setsockopt(skDesc, SOL_SOCKET, SO_BROADCAST, (char *)&on, sizeof(on));
sendto(skDesc, &nbNet, sizeof(long), 0, (struct sockaddr*) &adDiffusion, tailleAd);
//return 0;
}
int ouvreSocket(int port)
{
int skD;
int retVal;
size_t tailleAd;
struct sockaddr_in adLocale;
adLocale.sin_family = AF_INET; /* Type de la socket (TCP/IP) */
adLocale.sin_port = htons(port); /* Affectation du port local */
adLocale.sin_addr.s_addr = htonl(INADDR_ANY); /* Identificateur de l'hote */
skD = socket(AF_INET, SOCK_DGRAM, 0); /* Créé socket UDP (déconnectée) */
if(skD == -1)
{
perror("Erreur lors de la création de la socket\n");
return -1;
}
tailleAd = sizeof(adLocale);
retVal = bind(skD, (struct sockaddr*) &adLocale, tailleAd); /* Attache socket */
if(retVal == -1)
{
perror("Erreur lors du bind\n");
close(skD);
return -1;
}
return skD;
}
J'aimerais réaliser un broadcast par UDP sur le port 12001 (ou autre) ! J'ai fais pas mal de recherches et en glanant deux trois bout de codes par ci par la, j'ai fait un petit programme ... Néanmoins, après avoir sniffé sur ma carte réseau, je ne vois aucunde demande de broadcast... mon programme ne marche donc pas xD !
Si quelqu'un pouvait m'éclairer sur ce probleme...
Je vous remercie d'avance !
Mon code :
#include <iostream>
#include <io.h>
#include <winsock.h>
#include <winsock2.h>
#include <windows.h>
using namespace std;
int ouvreSocket(int port);
int main(void)
{
int on ;
int tailleAd;
int skDesc;
int portDiff = 6001;
struct sockaddr_in adDiffusion;
unsigned long adDiff;
char nbNet;
skDesc = ouvreSocket(6001); /* Créé socket UDP (déconnectée) */
adDiff = inet_addr("255.255.255.255"); /* Adresse -> broadcast */
printf("Adresse de broadcast = 0x%lX\n", adDiff);
adDiffusion.sin_addr.s_addr = adDiff; /* Identificateur de l'hote */
adDiffusion.sin_family = AF_INET; /* Type de la socket du serveur */
adDiffusion.sin_port = htons(portDiff); /* Port des serveurs */
tailleAd = sizeof(adDiffusion);
/* Met la socket en mode broadcast */
on = 1;
setsockopt(skDesc, SOL_SOCKET, SO_BROADCAST, (char *)&on, sizeof(on));
sendto(skDesc, &nbNet, sizeof(long), 0, (struct sockaddr*) &adDiffusion, tailleAd);
//return 0;
}
int ouvreSocket(int port)
{
int skD;
int retVal;
size_t tailleAd;
struct sockaddr_in adLocale;
adLocale.sin_family = AF_INET; /* Type de la socket (TCP/IP) */
adLocale.sin_port = htons(port); /* Affectation du port local */
adLocale.sin_addr.s_addr = htonl(INADDR_ANY); /* Identificateur de l'hote */
skD = socket(AF_INET, SOCK_DGRAM, 0); /* Créé socket UDP (déconnectée) */
if(skD == -1)
{
perror("Erreur lors de la création de la socket\n");
return -1;
}
tailleAd = sizeof(adLocale);
retVal = bind(skD, (struct sockaddr*) &adLocale, tailleAd); /* Attache socket */
if(retVal == -1)
{
perror("Erreur lors du bind\n");
close(skD);
return -1;
}
return skD;
}
A voir également:
- Net broadcast event window
- Net framework 2.0 - Télécharger - Divers Utilitaires
- Paint net - Télécharger - Dessin & Illustration
- Logo .net - Télécharger - Études & Formations
- Net framework 4.0 - Télécharger - Divers Utilitaires
- Youppie net - Forum Réseaux sociaux
6 réponses
Salut.
J'ai déjà rencontrer des problèmes avec le Broadcast. Il me semble que ce n'est pas totalement entièrement autoriser sur tout les réseau, en partie car cela pose quelques petit problème de sécurité ou des souci de type "flood".
deuxième point, avant d'essayer le broadcast total, essai celui qui correspond à ton sous réseau :
192.168.1.255 par exemple (pour un masque de sous réseau de 255.255.255.0).
J'ai déjà rencontrer des problèmes avec le Broadcast. Il me semble que ce n'est pas totalement entièrement autoriser sur tout les réseau, en partie car cela pose quelques petit problème de sécurité ou des souci de type "flood".
deuxième point, avant d'essayer le broadcast total, essai celui qui correspond à ton sous réseau :
192.168.1.255 par exemple (pour un masque de sous réseau de 255.255.255.0).
regarde là : http://www.presence-pc.com/forum/ppc/Programmation/socket-broadcast-sujet-3800-1.htm
Il y a aussi un lien intéressant dedans.
voi aussi là :
https://codes-sources.commentcamarche.net/
Il y a peut être une option sur la machine serveur, du genre "accepter les communications en broadcast"
Il y a aussi un lien intéressant dedans.
voi aussi là :
https://codes-sources.commentcamarche.net/
Il y a peut être une option sur la machine serveur, du genre "accepter les communications en broadcast"
Malgré ces liens très utiles, je n'ai toujours pas reussi à "debugger" mon problème ... :(
J'ai beau sniffer, l'envoi en UDP ne marche que pour une seule addresse IP... et si je met xxx.xxx.xxx.255, il envoie la requete udp uniquemetn sur xxx.xxx.xxx.255 :/
Si quelq'un à une idée, qu'il n'hésite pas..
Merci d'avance
Cédric
J'ai beau sniffer, l'envoi en UDP ne marche que pour une seule addresse IP... et si je met xxx.xxx.xxx.255, il envoie la requete udp uniquemetn sur xxx.xxx.xxx.255 :/
Si quelq'un à une idée, qu'il n'hésite pas..
Merci d'avance
Cédric
Sur le site code source, la personne présente une application en UDP broadcast. Je te conseil de télécharger les sources, et de voir si tu arrive à faire fonctionner chez toi. Si non, le problème ne viens pas du code source, mais de l'OS, ou un truc dans le genre. Si oui, regarde les différences entre son programme et le tiens, et adapte.
Re bonjour,
Bon après quelques bidouillages par ci par la, j'ai reussi a faire un broadcast sur xxx.xxx.xxx.255 ! cela fonctionne aussi pr xxx.255.255.255 ! Par contre... pour 255.255.255.255 cca ne fonctionne pas !
Je vais continuer a creuser .... En tout cas, merci pour ton aide précieuse ! S'il te reste une mini idée pour ce petit problème ca serait parfait ;p
Cedric
Bon après quelques bidouillages par ci par la, j'ai reussi a faire un broadcast sur xxx.xxx.xxx.255 ! cela fonctionne aussi pr xxx.255.255.255 ! Par contre... pour 255.255.255.255 cca ne fonctionne pas !
Je vais continuer a creuser .... En tout cas, merci pour ton aide précieuse ! S'il te reste une mini idée pour ce petit problème ca serait parfait ;p
Cedric
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
regarde du coté des classes réseau, je ne suis pas sur que tu puisse faire un broadcast en 255.255.255.255 avec n'importe quel IP.
Peux tu indiquer pourquoi tu n'y arrivais pas, ce qui bloquait. (pense à ceux qui ont le même problème que toi et qui tomberons sur la discussion)
Peux tu indiquer pourquoi tu n'y arrivais pas, ce qui bloquait. (pense à ceux qui ont le même problème que toi et qui tomberons sur la discussion)
Oups pardon, tu as raison,
Le probleme se passé lors du "sendto" étant donné que j'envoyais rien, personne me répondait xD !
Souhaitant détecter une imprimante, j'ai envoyé la trame correspondante et du coup, elle m'a répondue :) !!
Maintenant pour l'adresse 255.255.255.255, je n'ai pas encore trouvé la solution, je posterai si je la trouve !
Mais effectivement, il semble que les masques soient responsable ... je vais creuser tout ca !
MERCI encore pour ton aide !
Le probleme se passé lors du "sendto" étant donné que j'envoyais rien, personne me répondait xD !
Souhaitant détecter une imprimante, j'ai envoyé la trame correspondante et du coup, elle m'a répondue :) !!
Maintenant pour l'adresse 255.255.255.255, je n'ai pas encore trouvé la solution, je posterai si je la trouve !
Mais effectivement, il semble que les masques soient responsable ... je vais creuser tout ca !
MERCI encore pour ton aide !
Désolé pour le double post,
je précise juste que cela marche uniquement avec une trame spécifique pour mon imprimante ! C'set pourquoi je ne vous met pas la trame ici car cela serait dénué de sens.
Par contre, je cherche mais ne trouve pas quelle trame envoyer pour juste "pinger" toutes les machines ayant le port xxx ouvert .
Si quelqu'un connait cela, qu'il n'hésite pas a poster :)
je précise juste que cela marche uniquement avec une trame spécifique pour mon imprimante ! C'set pourquoi je ne vous met pas la trame ici car cela serait dénué de sens.
Par contre, je cherche mais ne trouve pas quelle trame envoyer pour juste "pinger" toutes les machines ayant le port xxx ouvert .
Si quelqu'un connait cela, qu'il n'hésite pas a poster :)
Salut à tous.
Je passais par là parce que j'avais le même problème que toi Cedric.
J'ai fait fait un programme en C (c'est à peu prés similaire au C++ non ,) tel que celui-ci et j'arrive sans aucun problème à pinguer en broadcast("255.255.255.255") sur les ports allant de 29900 à 29950.
[code]
int brodcast = 1;
sock = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP); /*protocole UDP: envoie en mode non connecte. protocole TCP: SOCK_STREAM*/
if(sock==INVALID_SOCKET) {
printf("Impossible d'ouvrir le socket");
/*le socket n'a pu se créer correctement*/
return EXIT_FAILURE;
}
printf("Socket correctement initialise\n");
for(port = 29900; port<=29950; port++){
sock_con.sin_addr.s_addr = INADDR_BROADCAST;
sock_con.sin_family = AF_INET;
sock_con.sin_port = htonl(port);
if(setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&broadcast, sizeof(broadcast))==0){
printf("Sucess on setsockopt !");
}
else{
printf("Failure on setsockopt !");
}
}
/code
Voila j'espère que ca pourra t'aider. J'ai quelques liens utiles:
http://www.beej.us/guide/bgnet/output/html/multipage/setsockoptman.html
https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-setsockopt
Je passais par là parce que j'avais le même problème que toi Cedric.
J'ai fait fait un programme en C (c'est à peu prés similaire au C++ non ,) tel que celui-ci et j'arrive sans aucun problème à pinguer en broadcast("255.255.255.255") sur les ports allant de 29900 à 29950.
[code]
int brodcast = 1;
sock = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP); /*protocole UDP: envoie en mode non connecte. protocole TCP: SOCK_STREAM*/
if(sock==INVALID_SOCKET) {
printf("Impossible d'ouvrir le socket");
/*le socket n'a pu se créer correctement*/
return EXIT_FAILURE;
}
printf("Socket correctement initialise\n");
for(port = 29900; port<=29950; port++){
sock_con.sin_addr.s_addr = INADDR_BROADCAST;
sock_con.sin_family = AF_INET;
sock_con.sin_port = htonl(port);
if(setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&broadcast, sizeof(broadcast))==0){
printf("Sucess on setsockopt !");
}
else{
printf("Failure on setsockopt !");
}
}
/code
Voila j'espère que ca pourra t'aider. J'ai quelques liens utiles:
http://www.beej.us/guide/bgnet/output/html/multipage/setsockoptman.html
https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-setsockopt