packet UDP sur broadcast

Codes specifiques à Linux
lolvince
Messages : 40
Inscription : lun. 11/déc./2006 16:11

Re: packet UDP sur broadcast

Message par lolvince »

remarque pour voir si ce n'est pas les VMs et ma machine qui bloque le port il n'y aurai pas un fichier.c de test pour envoyer une trame UDP sur le broadcast
afin de savoir si c'est l'appli compilé avec pure qui ne pase pas ?
lolvince
Messages : 40
Inscription : lun. 11/déc./2006 16:11

Re: packet UDP sur broadcast

Message par lolvince »

lolvince a écrit :bon je vais tester sur un autre linux sur un autre réseau (192.168.1.x) de pinguer son broadcast (192.168.1.255) voir ce que cela donne....
=> donc je confirme je peux envoyer sur 192.168.0.255 et 192.168.2.5 mais si je fais 192.168.1.255 (Le broadcast du réseau en cour) j'ai une erreur d’envoi (-1) :(

alors voila pour mon on ne peux envoyer une trame UDP sur le broadcast avec purebasic compilé sous Linux ... :( du moins avec les fonctions OpenNetworkConnection et SendNetworkData

il y a des anciens bout de code qui permette un ping en trés bas niveau il me semble, je en sait pas si il y aurai moyen d'exploiter ça ...
doudouvs
Messages : 244
Inscription : jeu. 07/mars/2013 19:02
Localisation : France Alsace / Espagne Girona

Re: packet UDP sur broadcast

Message par doudouvs »

Premiere chose a faire un "ping" si ta pas de réponse verifier avec "ifconfig" (UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST)

Voila un exemple "eth0" :

Code : Tout sélectionner

eth0      Link encap:Ethernet  HWaddr ******  
          inet adr:*.*.*.*  Bcast:*.*.*.*  Masque:255.255.255.224
          adr inet6: *************/64 Scope:Lien
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:5523465 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2462193 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:0 
          RX bytes:3079879916 (2.8 GiB)  TX bytes:461055564 (439.6 MiB)

Si tout est bon alors il reste a voir :
iptable -L voir si tu na pas fail2ban ou autre filtre sur ta machine
tu peut aussi utiliser nmap pour scanner les ports
GCC 7.4.0 / PureBasic 5.71 / Ubuntu 18.04.3 LTS
doudouvs
Messages : 244
Inscription : jeu. 07/mars/2013 19:02
Localisation : France Alsace / Espagne Girona

Re: packet UDP sur broadcast

Message par doudouvs »

ah je viens de pensé à un truc ta un routeur ? si oui un routeur ne transmettent pas les paquets broadcast
GCC 7.4.0 / PureBasic 5.71 / Ubuntu 18.04.3 LTS
lolvince
Messages : 40
Inscription : lun. 11/déc./2006 16:11

Re: packet UDP sur broadcast

Message par lolvince »

alors oui j'ai un routeur !
mais alors pourquoi sous Windows ça fonctionne et pas sur une machine en linux dans le même réseau ?
doudouvs
Messages : 244
Inscription : jeu. 07/mars/2013 19:02
Localisation : France Alsace / Espagne Girona

Re: packet UDP sur broadcast

Message par doudouvs »

je connait pas ta configuration réseau !!!

Tu peux avoir un routeur entre X et Y ou meme une machine peut faire router, je parle d'un routeur pas d'un switch
GCC 7.4.0 / PureBasic 5.71 / Ubuntu 18.04.3 LTS
lolvince
Messages : 40
Inscription : lun. 11/déc./2006 16:11

Re: packet UDP sur broadcast

Message par lolvince »

Pour le réseau il n'y a rien de très compliqué !
_______________
PC & VMs=====>|
NAS=========>| => Switch => Freebox (en mode routeur évidement)
Serv Linux====>|
______________|
les VMs sont en mode pont sur ma carte réseau filaire (pas de WIFI pour ces machines)
si je lance le code depuis mon pc (win7 64) la trame part, mon Serv Linux me répond car il intercepte la trame du broadcast.
si je lance le même code depuis mes VMs(linux) ou mon NAS(debian) la trame ne part pas ... mais si je met l'ip direct de mon Serv linux, ça fonctionne !
mais le but d'envoyer cette trame, c'est de découvrir mon Serv Linux qui en théorie peut se trouver n'importe ou sur le réseau ...
doudouvs
Messages : 244
Inscription : jeu. 07/mars/2013 19:02
Localisation : France Alsace / Espagne Girona

Re: packet UDP sur broadcast

Message par doudouvs »

tu peut sender un ifconfig de la VM et du serv linux
GCC 7.4.0 / PureBasic 5.71 / Ubuntu 18.04.3 LTS
lolvince
Messages : 40
Inscription : lun. 11/déc./2006 16:11

Re: packet UDP sur broadcast

Message par lolvince »

je tien à préciser qu'une VM Win XP sp3 32 bit lance mon code et ça part parfaitement ....
donc cela ne vient pas de la virtualisation ...

pour if config du srv linux je ne peut rien faire je n'ai pas la main dessus (Boitier domo non ouvert) je sait qu'il intercepte les trame UDP de broadcast (quand elle parte bien sur :p ^^)
lolvince
Messages : 40
Inscription : lun. 11/déc./2006 16:11

Re: packet UDP sur broadcast

Message par lolvince »

voila pour mon NAS par exemple

DiskStation> ifconfig
eth0 Link encap:Ethernet HWaddr 00:48:9D:B3:CC:60
inet addr:192.168.0.250 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::248:9dff:feb3:cc60/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:536013 errors:0 dropped:0 overruns:0 frame:0
TX packets:3429478 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:82053508 (78.2 MiB) TX bytes:4906414603 (4.5 GiB)
Interrupt:18

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:3395424 errors:0 dropped:0 overruns:0 frame:0
TX packets:3395424 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:38359798572 (35.7 GiB) TX bytes:38359798572 (35.7 GiB)
lolvince
Messages : 40
Inscription : lun. 11/déc./2006 16:11

Re: packet UDP sur broadcast

Message par lolvince »

@doudouvs => tu as les même symptôme de ton coté non ? sans parler de mon réseau perso...
si tu compile toi même sur windows tu vera que cela fonctionne sous windows
si tu compile sous linux tu verras que la requête ne part pas si tu es sous linux ...

Âpres ça, si cela fonctionne chez toi, c'est qu'il y a un souci réseau effectivement sur 2 sites différent ici
lolvince
Messages : 40
Inscription : lun. 11/déc./2006 16:11

Re: packet UDP sur broadcast

Message par lolvince »

je test sur d'autre version ... compilé sur ubuntu 32 et 64 bit voire si ça change quelque chose sachant que c'est un autre site également ...

donc je confirme :
sur 2 autre machine linux dans un autre réseau j'ai toujours un refus d'envoi en UDP sur broadcast.
j'ai donc compilé un bout de code en C pour voir si il y a avait du changement et ...... oui il y en a
mon code en C refuse d'envoyer sur le broadcast également ^^

voici son code :

Code : Tout sélectionner

#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#define HELLO_PORT [color=#BF0000]49999[/color]
#define HELLO_GROUP "[color=#BF0000]192.168.0.255[/color]"

int main(int argc, char *argv[])
{
    struct sockaddr_in addr;
    int fd;
    char *message = "Hello, World!";
    if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        perror("socket");
        exit(1);
    }
    /* set up destination address */
    memset(&addr,0,sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr(HELLO_GROUP);
    addr.sin_port=htons(HELLO_PORT);
    while (1)
    {
        if (sendto(fd, message, strlen(message), 0,(struct sockaddr *) &addr, sizeof(addr)) < 0)
        {
            perror("sendto");
            exit(1);
        }
        sleep(3);
    }
}
Si on change l'ip ça part ...
mais en 255 => sendto: Permission denied

que faut-il comprendre ? linux nous briderai ?
lolvince
Messages : 40
Inscription : lun. 11/déc./2006 16:11

Re: packet UDP sur broadcast

Message par lolvince »

YEEEEPPEEEEEEEEEEEEE !! :P

bon ça y est j'ai trouvé la cause ...
donc sous linux un envoi sur broadcast est refusé par défaut !
donc vu aussi avec mon code en C mais la qui renvoi une erreur plus parlante => "sendto: Permission denied" (inutile de dire que je suis en ROOT :p)

en creusant un peu on se rend compte qu'il faut "une permission spécial" ... donc voila mon code C qui fonctionne :

Code : Tout sélectionner

#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    char *dstIP = "192.168.0.255";
	char *localIP = "192.168.0.250";
	int BroadcastPort = 49999;
	int sock;                         /* Socket */
/-------------------------------Permission Broadcast------------------------------------/
    struct sockaddr_in broadcastAddr; /* Broadcast address */
    int broadcastPermission;          /* Socket opt to set permission to broadcast */
    unsigned int localIPLen;       /* Length of string to broadcast */
/---------------------------------------------------------------------------------------/
    /* Create socket for sending/receiving datagrams */
    if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
        perror("socket() failed");
    /* Set socket to allow broadcast */
    broadcastPermission = 1;
    if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (void *) &broadcastPermission, 
          sizeof(broadcastPermission)) < 0)
        perror("setsockopt() failed");
    /* Construct local address structure */
    memset(&broadcastAddr, 0, sizeof(broadcastAddr));   /* Zero out structure */
    broadcastAddr.sin_family = AF_INET;                 /* Internet address family */
    broadcastAddr.sin_addr.s_addr = inet_addr(dstIP);   /* Broadcast IP address */
    broadcastAddr.sin_port = htons(BroadcastPort);      /* Broadcast port */
    localIPLen = strlen(localIP);  /* Find length of localIP */
    int j;
    for (j=0; j<1; j++) //doesnt mean anything so far, not important
    {
         /* Broadcast localIP in datagram to clients */
         if (sendto(sock, localIP, localIPLen, 0, (struct sockaddr *) 
               &broadcastAddr, sizeof(broadcastAddr)) != localIPLen)
             perror("sendto() sent a different number of bytes than expected");
    }
}
Voila avec ceci on a bien la trame en UDP qui part sur le broadcast ...
la structure de la socket est différente, elle inclu une "permission spéciale".

maintenant la question qui tue, comment je fait pour faire la même chose avec mon purebasic adoré ? :mrgreen:
lolvince
Messages : 40
Inscription : lun. 11/déc./2006 16:11

Re: packet UDP sur broadcast

Message par lolvince »

bon j'ai trouvé un bout de code Pure de ... 2006 !!!
mais il ne fonctionne pas sur LINUX, mais sur Windows :(
si quelqu'un peut le traduire, le voici ...

Code : Tout sélectionner

Procedure.l SendUDPBroadcastL (port, message.s)
  Protected sock,one,bytes,remote.sockaddr_in
 
  sock = SOCKET_(#AF_INET,#SOCK_DGRAM,#IPPROTO_IP)
  If ( sock = -1) : ProcedureReturn 1 : EndIf
  one = 1
  If (setsockopt_(sock,#SOL_SOCKET,#SO_BROADCAST,@one,SizeOf(one)) = -1)
    ProcedureReturn 1
  EndIf
  remote\sin_family = #AF_INET
  remote\sin_port = htons_(port)
  remote\sin_addr = #INADDR_BROADCAST
  if (sendto_(sock,message,Len(message),0,@remote,SizeOf(remote)) = -1)
    ProcedureReturn 1
  EndIf
  closesocket_(sock)
  ProcedureReturn 0
EndProcedure
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: packet UDP sur broadcast

Message par Backup »

vas voir là :

http://forums.purebasic.com/english/vie ... 9c89cd0433

et là

http://www.purebasic.fr/english/viewtop ... st#p365942

c'est pour Mac Osx mais ça devrai le faire avec Linux , puisque pas d'API ;)
Répondre