[C++] Probleme avec un broadcast UDP

Fermé
Cédric - 16 mai 2008 à 16:00
 Rarenlys - 27 juil. 2008 à 23:13
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;
}
A voir également:

6 réponses

up :/
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
19 mai 2008 à 09:19
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).
0
Merci pour ta réponse,
J'ai testé le broadcast correspondant à mon sous réseau. Résultat, il envoie bien la demande en UDP mais pas en broadcast, il se contente de l'envoyer à l'adresse unique xx.xx.xx.255

Il dois me manquer quelques chose dans mon programme mais quoi xD ! Telle est la question :/
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
19 mai 2008 à 12:36
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"
0
Merci pour tous ces liens,
j'y jette un oeil tout de suite !!
0
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
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
20 mai 2008 à 10:33
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.
0
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
20 mai 2008 à 14:59
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)
0
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 !
0
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 :)
0
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
0