Rechercher : dans
Par :

[C++] Probleme avec un broadcast UDP

Dernière réponse le 27 jui 2008 à 23:13:38 Cédric, le 16 mai 2008 à 16:00:43 
 Signaler ce message aux modérateurs

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;
}

Configuration: Windows XP
Internet Explorer 6.0

Meilleures réponses pour « [C++] Probleme avec un broadcast UDP » dans :
La compilation et les modules en C et en C++ VoirCet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du...
TCP / UDP : Quelles différences ? VoirLe protocole UDP UDP est un protocole orienté "non connexion". Pour faire simple, lorsqu'une machine A envoie des paquets à destination d'une machine B, ce flux est unidirectionnel. En effet, la transmission des données se fait sans prévenir le...
Compiler du C sous Linux/UNIX VoirSous Linux, le compilateur de C est gcc. Il est installé de base sur plusieurs distributions, mais sur Debian (et celles qui en découlent) il faudra l'installer (aptitude install gcc). gcc Syntaxe de GCC gcc Tout d'abord, il faut savoir...
Télécharger Visual C++ Express VoirVisual C++ Express est une version "gratuite" et allégée de Visual Studio ; l'utilisation requiert l'inscription sur le site de Microsoft. Cet environnement de développement permet de créer des application Win32 ou du .NET C.
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...
Langage C - Les opérateurs VoirQu'est-ce qu'un opérateur ? Les opérateurs sont des symboles qui permettent de manipuler des variables, c'est-à-dire effectuer des opérations, les évaluer, etc. On distingue plusieurs types d'opérateurs : les opérateurs de calcul les opérateurs...

1

cédric, le 19 mai 2008 à 09:05:21

Up :/

Répondre à cédric

2

Char Snipeur, le 19 mai 2008 à 09:19:31

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). Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur

3

cédric, le 19 mai 2008 à 10:24:31

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 :/

Répondre à cédric

4

Char Snipeur, le 19 mai 2008 à 12:36:11

Regarde là : http://www.presence-pc.com/forum/ppc/Programmation/socket-br­oadcast-sujet-3800-1.htm
Il y a aussi un lien intéressant dedans.
voi aussi là :
http://www.cppfrance.com/...
Il y a peut être une option sur la machine serveur, du genre "accepter les communications en broadcast" Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur

5

cédric, le 19 mai 2008 à 14:05:56

Merci pour tous ces liens,
j'y jette un oeil tout de suite !!

Répondre à cédric

6

Cedric, le 20 mai 2008 à 09:21:14

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

Répondre à Cedric

7

Char Snipeur, le 20 mai 2008 à 10:33:06

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. Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur

8

Cedric, le 20 mai 2008 à 14:49:20

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

Répondre à Cedric

9

Char Snipeur, le 20 mai 2008 à 14:59:21

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) Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur

10

Cedric, le 20 mai 2008 à 15:17:57

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 !

Répondre à Cedric

11

Cedric, le 20 mai 2008 à 16:33:16

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 :)

Répondre à Cedric

12

 Rarenlys, le 27 jui 2008 à 23:13:38

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
http://msdn.microsoft.com/en-us/library/ms740476(VS.85).aspx

Répondre à Rarenlys
Collection CommentÇaMarche.net